Содержание
Список рисунков
Список таблиц
Информация в данной публикации была признана технически обоснованной по консенсусу лиц, участвовавших в разработке и утверждении документа на момент его создания. Консенсус не обязательно означает единогласное согласие всех лиц, участвующих в разработке данного документа.
Стандарты и руководящие документы NEMA, одним из которых является документ, содержащийся в данном издании, разрабатываются в рамках добровольного процесса разработки стандартов на основе консенсуса. Этот процесс объединяет добровольцев и/или выявляет мнения лиц, заинтересованных в теме, охватываемой данной публикацией. Хотя NEMA управляет процессом и устанавливает правила для обеспечения справедливости при достижении консенсуса, NEMA не составляет документ и не проводит независимое тестирование, оценку или проверку точности или полноты какой-либо информации или обоснованности каких-либо суждений, содержащихся в стандартах и руководящих документах.
NEMA отказывается от ответственности за любой личный ущерб, имущественный или иной ущерб любого характера, будь то специальный, косвенный, последующий или компенсационный, прямо или косвенно вытекающий из публикации, использования, применения или reliance на данный документ. NEMA не даёт никаких гарантий, явных или подразумеваемых, в отношении точности или полноты любой информации, опубликованной в данном документе, и не гарантирует, что информация в данном документе будет отвечать каким-либо конкретным целям или потребностям. NEMA не берёт на себя обязательств по гарантированию характеристик продуктов или услуг какого-либо отдельного производителя или продавца посредством данного стандарта или руководства.
Публикуя и предоставляя доступ к данному документу, NEMA не берёт на себя обязательств по оказанию профессиональных или иных услуг от имени или в интересах какого-либо лица или организации, а также не берёт на себя выполнение каких-либо обязанностей, возложенных на какое-либо лицо или организацию по отношению к третьим лицам. Любой пользователь данного документа должен полагаться на собственное независимое суждение или, в зависимости от обстоятельств, обращаться за консультацией к компетентному специалисту для определения разумной осмотрительности в каждой конкретной ситуации. Информация и другие стандарты по теме, охватываемой данной публикацией, могут быть доступны из других источников, которые пользователь может пожелать изучить для получения дополнительных мнений или информации, не охваченных данной публикацией.
NEMA не обладает полномочиями для контроля за соблюдением содержания данного документа и не осуществляет такой контроль. NEMA не сертифицирует, не тестирует и не проверяет продукты, конструкции или установки в целях безопасности или охраны здоровья. Любая сертификация или иное заявление о соответствии любой информации, связанной со здоровьем или безопасностью, содержащейся в данном документе, не может быть приписано NEMA и является исключительно ответственностью органа сертификации или лица, сделавшего такое заявление.
Данный стандарт DICOM был разработан в соответствии с процедурами Комитета по стандартам DICOM.
Стандарт DICOM структурирован как документ, состоящий из нескольких частей, с использованием руководящих принципов, установленных в [ISO/IEC Directives, Part 2].
DICOM® является зарегистрированным товарным знаком Национальной ассоциации производителей электрооборудования (National Electrical Manufacturers Association) для её стандартных публикаций, относящихся к цифровой передаче медицинской информации; все права защищены.
HL7® и CDA® являются зарегистрированными товарными знаками организации Health Level Seven International; все права защищены.
SNOMED®, SNOMED Clinical Terms®, SNOMED CT® are the registered trademarks of the International Health Terminology Standards Development Organisation (IHTSDO), all rights reserved.
LOINC® is the registered trademark of Regenstrief Institute, Inc, all rights reserved.
Данная часть стандарта DICOM определяет интерфейс между двумя программными приложениями. Одно приложение — хостинговая система (Hosting System) — предоставляет второму приложению данные, такие как набор изображений и связанных данных. Второе приложение — хостимое приложение (Hosted Application) — анализирует эти данные, потенциально возвращая результаты анализа, например, в виде другого набора изображений и/или структурированных отчётов, первому приложению. Такой программный интерфейс приложений (Application Program Interface, API) отличается по области охвата от других частей стандарта DICOM тем, что он стандартизирует обмен данными между программными компонентами в одной системе, а не обмен данными между различными системами. Программы хостимых приложений, написанные для данного стандартизированного интерфейса, могут «подключаться» (plug-in) (см. Рисунок 1-1) к хостинговым системам. Понятие программных дополнений или «plug-in» широко распространено в мире вычислительной техники и успешно применяется для расширения возможностей веб-браузеров, медиаплееров, графических редакторов, издательских программ и т. д. Разработчику хостинговой системы достаточно создать стандартизированный API один раз, чтобы обеспечить поддержку широкого спектра дополнительных хостимых приложений.
В традиционной модели «plug-in» модуль «plug-in» предназначен для конкретной хост-системы (например, определённой программы веб-браузера) и может не работать в других хост-системах (например, в других веб-браузерах). PS3.19 определяет стандартизированный API, который может быть реализован любой хостинговой системой. Хостимое приложение «plug-in», написанное для стандартизированного API, сможет работать в любой хостинговой системе, реализующей этот стандартизированный API (см. Рисунок 1-2).
Цели и предположения для API включают:
Независимость от языка — API определён таким образом, что программы, написанные на любом распространённом языке программирования, могут его использовать.
Независимость от платформы — API определён таким образом, что он не зависит от какой-либо конкретной вычислительной платформы или операционной системы.
Расширяемость — API может быть расширен с обратной совместимостью. Старые приложения продолжают работать даже при наличии новых расширений, в то время как новые приложения, использующие расширения, получают доступ к более широкому набору функций.
Защищённость — дизайн API совместим с последующим добавлением механизмов защиты прав интеллектуальной собственности и механизмов, обеспечивающих наличие соответствующих разрешений и лицензий. API не должен препятствовать работе стандартных систем лицензирования.
Безопасность — доступ хостимого приложения к данным в хостинговой системе должен контролироваться через API хостинговой системой. Хостинговая система отвечает за контроль доступа и журнал аудита, поскольку именно она предоставляет данные хостимому приложению.
Использование существующих технологий — определение API использует существующие широко применяемые технологии, насколько это практически целесообразно, и не определяет новые методологии.
Одновременный запуск — хостинговая система сможет запускать несколько экземпляров одного или разных хостимых приложений одновременно.
Распределённое исполнение — хотя API разработан для локального исполнения, он не препятствует удалённому исполнению, когда приложение работает в системе, отличной от хоста.
PS3.19 определяет как взаимодействия, так и программные интерфейсы приложений (API) между хостинговыми системами и хостимыми приложениями. PS3.19 также включает нормативные и информативные приложения, определяющие модели данных, используемые API, определённым в данной части.
API напрямую не затрагивает управление рабочим процессом (workflow management), которое обеспечивается другими сервисами DICOM.
Следующие стандарты содержат положения, которые посредством ссылок в данном тексте составляют положения настоящего стандарта. На момент публикации были действительны указанные редакции. Все стандарты подлежат пересмотру, и сторонам соглашений, основанных на настоящем стандарте, рекомендуется изучить возможность применения самых последних редакций указанных ниже стандартов.
[ISO/IEC Directives, Part 2] 2021. 9.0. Rules for the structure and drafting of International Standards. http://www.iso.org/sites/directives/current/part2/index.xhtml .
[ISO 8822] 1988. Information processing systems - Open Systems Interconnection - Connection oriented presentation service definition.
[ISO/IEC 19757-2] 2008. Information technology — Document Schema Definition Language (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG. http://www.iso.org/standard/52348.html .
[ISO/IEC 19757-3] 2016. Information technology — Document Schema Definition Languages (DSDL) — Part 3: Rule-based validation — Schematron. http://www.iso.org/standard/55982.html .
[ITU-T X.667] 2012. Information technology - Procedures for the operation of object identifier registration authorities: Generation of universally unique identifiers and their use in object identifiers. http://www.itu.int/rec/T-REC-X.667/en .
[WSDL 1.1] 26 June 2007. W3C Recommendation Web Services Description Language (WSDL) 1.1. http://www.w3.org/TR/wsdl .
[XSD1] 28 October 2004. XML Schema Part 1: Structures Second Edition. W3C Recommendation. http://www.w3.org/TR/xmlschema-1/ .
[XPath 2.0] October 2016. W3C Recommendation XML Path Language (XPath) 2.0. http://www.w3.org/TR/xpath20/ .
[InfoSet] 4 February 2004. W3C Recommendation XML Information Set. http://www.w3.org/TR/xml-infoset/ .
[RFC2045] November 1996. Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. http://tools.ietf.org/html/rfc2045 .
[RFC2046] November 1996. Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. http://tools.ietf.org/html/rfc2046 .
[RFC2048] November 1996. Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures. http://tools.ietf.org/html/rfc2048 .
[RFC3240] February 2002. Digital Imaging and Communications in Medicine (DICOM) - Application/dicom MIME Sub-type Registration. http://tools.ietf.org/html/rfc3240 .
[RFC3986] Uniform Resource Identifiers (URI): Generic Syntax. http://tools.ietf.org/html/rfc3986 .
Для целей настоящего стандарта применяются следующие определения.
В данной части стандарта используются следующие термины, определённые в [ISO 8822]:
See [ISO 8822].
See [ISO 8822].
В данной части стандарта используются следующие термины, определённые в [InfoSet]:
Понятие XML-атрибута (XML Attribute) совершенно отлично от понятия атрибута DICOM (DICOM Attribute).
Во избежание путаницы с терминами DICOM, имеющими схожие названия, текст стандарта DICOM будет использовать термины XML Element и XML Attribute при обращении к этим понятиям XML Infoset. Появление терминов Element или Attribute без префикса «XML», как правило, относится к понятиям DICOM, а не к понятиям XML Infoset.
В данной части стандарта используются следующие термины, определённые в PS3.1:
В данной части стандарта используются следующие термины, определённые в PS3.3:
В данной части стандарта используются следующие термины, определённые в PS3.5:
В данной части стандарта используются следующие термины, определённые в PS3.16:
В данной части стандарта обычно используются следующие определения:
Набор методов интерфейса, которые хостимые приложения и хостинговые системы используют для взаимодействия друг с другом.
Приложение, запускаемое и управляемое хостинговой системой. Хостимое приложение может использовать сервисы, предоставляемые хостинговой системой.
Приложение, используемое для запуска и управления хостимыми приложениями. Хостинговая система предоставляет ряд сервисов, таких как извлечение и хранение DICOM-объектов для хостимого приложения. Хостинговая система обеспечивает инфраструктуру, в которой работает хостимое приложение и взаимодействует с внешней средой. Это включает сетевой доступ, базу данных и безопасность.
В данной части стандарта используются следующие термины, определённые в PS3.4:
В данной части стандарта используются следующие символы и сокращения.
Термины, перечисленные в Разделе 3 «Определения», пишутся с заглавной буквы по всему документу.
В данном разделе описываются возможности API, приводится пример последовательности операций и кратко резюмируются остальные разделы данной части.
Интерфейсы API совместно используются хостинговой системой и одним или несколькими хостимыми приложениями.
API не зависит от аппаратной платформы, операционной системы и графического интерфейса пользователя (GUI). API поддерживает запрос пространства в GUI, если оно доступно. API поддерживает работу без графического интерфейса (headless, т. е. без GUI).
Интерфейсы API определены с использованием языка определения веб-сервисов (Web Services Definition Language, WSDL) для обеспечения независимости от языка программирования, платформы и технологий. Интерфейсы API разработаны с целью максимальной независимости от языка при минимальном влиянии на эффективность использования технологии веб-сервисов. Интерфейсы поддерживают как сетевую модель взаимодействия на основе файлов, так и модель взаимодействия с общей памятью. API поддерживает ручную настройку, но не поддерживает обнаружение (discovery).
API может предоставлять наборы данных DICOM (DICOM Data Sets) и другие данные хостимому приложению и может принимать наборы данных DICOM и другие данные, созданные хостимым приложением, как инкрементально, так и по завершении. Хостимое приложение имеет гранулярный доступ к данным, предоставляемым хостинговой системой (например, к отдельным атрибутам, подмножеству данных пикселей и т. д.), и только к этим данным. API использует семантику DICOM, но не обязательно сетевой синтаксис передачи DICOM. Хостинговая система предоставляет хостимому приложению механизм для генерации UID.
API позволяет хостинговой системе приостанавливать и/или отменять работу хостимого приложения и возвращать управление пользовательским интерфейсом. API поддерживает возврат информации о статусе от хостимого приложения к хостинговой системе и отслеживание состояния хостимого приложения.
Хостинговая система имеет механизм для запуска или подключения к одному или нескольким хостимым приложениям, проверки того, что хостимое приложение успешно запущено, и последующей передачи исходных объектов данных. Все взаимодействия инициируются хостинговой системой. Типичная последовательность событий следующая:
Хостинговая система идентифицирует и находит хостимое приложение, подходящее для задачи и данных, с использованием методов, специфичных для хоста. Часто желаемое приложение выбирается пользователем системы или определяется в записи рабочего списка (work list).
Хостинговая система запускает приложение, по существу выдавая команду «run» или «exec» с параметрами, которые хостимое приложение использует для установления двусторонней связи между ними.
Хостинговая система использует API для инициирования задачи обработки в хостимом приложении и уведомляет его о входных данных.
Хостимое приложение использует API для получения от хостинговой системы информации о входных данных, включая расположение данных больших объёмов пикселей (bulk pixel data).
Хостимое приложение может использовать файловый ввод-вывод, отображение в память (memory mapping) или любой другой подходящий метод для доступа к данным больших объёмов пикселей.
Хостимое приложение может также использовать API для информирования хостинговой системы о статусе обработки, например о ходе выполнения, предупреждениях или ошибках.
Хостинговая система может использовать API для приостановки или отмены обработки в хостимом приложении.
Если хостинговая система приостановила обработку в хостимом приложении, она может использовать API для указания хостимому приложению возобновить обработку.
Хостимое приложение в процессе обработки входных данных может создавать выходные объекты и использовать API для информирования хостинговой системы об их существовании.
Хостинговая система использует API для получения от хостимого приложения информации о выходных объектах, включая расположение данных больших объёмов.
Хостинговая система может при необходимости использовать файловый ввод-вывод, отображение в память или любой другой подходящий метод для доступа к выходным данным больших объёмов.
После того как хостинговая система получила выходные данные от хостимого приложения, она использует API для указания хостимому приложению ожидать следующую задачу обработки (т. е. переводит хостимое приложение в режим ожидания).
Если у хостинговой системы есть другая задача для хостимого приложения, она может использовать API для запуска этой задачи, следуя данной последовательности событий начиная с шага 3.
Когда хостинговой системе больше не требуется хостимое приложение, она может использовать API для запроса хостимого приложения на завершение работы.
Раздел 7 более подробно описывает жизненный цикл хостимого приложения.
Раздел 8 описывает базовые интерфейсы между хостинговой системой и хостимым приложением.
Раздел 9 описывает пользовательские типы данных и структуры данных, используемые интерфейсами.
Раздел 10 описывает общую форму моделей, используемых интерфейсами на основе моделей, и соглашения, применяемые при определении этих моделей. Модели, определённые настоящим стандартом, описаны в приложениях.
Хостинговая система инициализирует хостимое приложение путём выдачи команды запуска (run) или её эквивалента (например, функции exec в языке C) с параметрами командной строки, задающими ссылки на конечные точки (URL-адреса) для использования интерфейсов. Одна ссылка на конечную точку используется хостимым приложением для доступа к интерфейсу Host, предоставляемому хостинговой системой. Вторая ссылка на конечную точку — это адрес, по которому хостинговая система будет искать интерфейс Application, предоставляемый хостимым приложением. Интерфейсы Host и Application описаны в Разделе 8. При запуске из командной строки или оболочки команда запуска может выглядеть следующим образом:
app--hostURL url1--applicationURL url2
В данном методе запуска именно хостинговая система, а не хостимое приложение, указывает оба URL-адреса. Хостимое приложение должно отвечать по URL-адресу, назначенному ему хостинговой системой.
Реализация хостимого приложения, в которой оно выполняется удалённо или на сервере приложений, может использовать стартовое приложение или прокси-приложение для соответствующего сопоставления URL-адреса, предоставленного хостинговой системой, и фактического URL-адреса, используемого хостимым приложением.
Рисунок 7.1-1 показывает диаграмму последовательности инициализации хостимого приложения. После того как хостимое приложение инициализировано и готово к началу обработки данных, оно переходит в состояние IDLE и уведомляет хостинговую систему об изменении состояния с помощью вызова метода notifyStateChanged(), тем самым информируя хостинговую систему о готовности хостимого приложения к работе.
Рисунок 7.2-1 показывает диаграмму состояний хостимого приложения. Состояния определены в Таблице 7.2-1.
Таблица 7.2-1. Состояния
Переходы между состояниями описаны в Таблице 7.2-2.
Таблица 7.2-2. Переходы между состояниями
Хостимое приложение уведомляет хостинговую систему обо всех переходах состояний путём вызова метода notifyStateChanged().
Если хостимое приложение не реагирует на запросы об изменении состояния, сделанные хостинговой системой, хостинговая система может выполнить «жёсткую остановку» (hard abort) хостимого приложения некоторым специфичным для реализации способом, например, путём завершения процесса, в котором выполняется хостимое приложение.
В данной части определены три базовых интерфейса, как показано на Рисунке 8-1. Один из них, named «Application», представляет хостимое приложение и используется хостинговой системой для управления хостимым приложением. Второй, named «Host», представляет хостинговую систему и используется хостимым приложением для запроса служб и уведомления хостинговой системы о событиях во время выполнения хостимого приложения. Третий, named «DataExchange», — это интерфейс, используемый как хостинговой системой, так и хостимым приложением для обмена информацией о данных, подлежащих передаче. Таким образом, полная реализация хостимого приложения («ApplicationService») состоит из комбинации базовых интерфейсов «Application» и «DataExchange», тогда как полная реализация хостинговой системы («HostService») состоит из комбинации базовых интерфейсов «Host» и «DataExchange».
Интерфейсы определены как набор методов с использованием языка описания веб-сервисов (WSDL). При развёртывании хостимых приложений и хостинговых систем, использующих эти интерфейсы, разработчики должны изменить ссылки на конечные точки (т. е. XML-атрибут «location» внутри XML-элемента «address», находящегося внутри XML-элементов «port» XML-элемента «service») в спецификации WSDL соответствующим образом.
Основные (не обеспечивающие обратную совместимость) версии интерфейсов отражаются в значениях XML-атрибутов «name» и «targetNamespace» XML-элемента «definitions» в спецификации WSDL интерфейсов. Любые изменения интерфейсов, не обеспечивающие обратную совместимость, будут использовать новые значения XML-атрибутов «name» и «targetNamespace» XML-элемента «definitions».
Дополнительные (обеспечивающие обратную совместимость) версии интерфейсов могут отражаться в значениях XML-атрибута «targetNamespace» любого нового XML-элемента «schema», где в спецификациях WSDL определяются новые типы входных или выходных данных, и/или в значениях XML-атрибутов «name» XML-элементов «portType» и «service», где новые сообщения и операции связываются как новые службы в спецификациях WSDL интерфейсов. Для обеспечения обратной совместимости имена существующих элементов, сообщений и операций в спецификации WSDL интерфейсов остаются неизменными.
Эти методы используют набор базовых типов данных и более сложные структуры данных для передачи параметров, которые определены с использованием XML-схем. В последующих разделах данного документа приведены более подробные описания интерфейсов и структур данных, а также диаграммы последовательности, иллюстрирующие использование интерфейсов.
Фактический код WSDL и XML-схемы, определяющие данный интерфейс, приведены в Приложении B.
WSDL — это не зависящее от платформы и языка программирования средство определения интерфейса между двумя взаимодействующими приложениями. Приложения не обязаны быть написаны на одном и том же языке программирования.
Интерфейсы не предназначены для непосредственного решения проблем обмена сообщениями SOAP. Если во время выполнения вызова интерфейса WSDL возникает проблема в обмене данными между хостинговой системой и хостимым приложением, она должна быть обработана библиотеками SOAP, используемыми в реализации, например, путём генерации исключения (exception).
В следующих разделах описаны методы интерфейса Application.
Хостимое приложение возвращает вызывающей стороне своё текущее состояние.
Этот метод может быть вызван в любое время.
Хостинговая система может использовать этот метод как альтернативу отслеживанию изменений состояния хостимого приложения, сообщаемых вызовом метода notifyStateChanged().
Хостинговая система может использовать этот метод, чтобы определить, работает ли ещё хостимое приложение (т. е. не завершилось ли оно без вызова метода notifyStateChanged() с состоянием EXIT).
Хостинговая система запрашивает переключение хостимого приложения в состояние newState.
Хостимое приложение возвращает из метода значение TRUE, если оно получило запрос и запрошенное изменение состояния допустимо в диаграмме состояний. В противном случае метод возвращает FALSE. Возвращаемое значение TRUE не означает, что состояние хостимого приложения уже изменилось на newState; оно лишь указывает, что запрошенное изменение состояния является допустимым и будет выполнено при первой возможности. После переключения хостимого приложения в запрошенное состояние оно должно информировать хостинговую систему посредством метода notifyStateChanged() интерфейса Host.
Асинхронный ответ на изменение состояния предназначен для минимизации блокировки хостинговой системы во время ожидания потенциально длительного изменения состояния в приложении.
Хостимое приложение должно игнорировать любой вызов setState() и возвращать TRUE, если хостимое приложение уже находится в запрошенном состоянии (т. е. это повторный вызов с тем же состоянием).
Если хостимое приложение получает второй запрос setState() для другого состояния до завершения предыдущего запроса, оно должно прервать или проигнорировать предыдущий запрос и начать обработку последнего запроса.
Этот метод может быть вызван в любое время, однако может не иметь никакого эффекта (кроме возврата FALSE), если запрошенное новое состояние не является допустимым переходом из текущего состояния.
Вызывая этот метод, хостинговая система просит хостимое приложение предпринять необходимые действия для отображения своего графического интерфейса (GUI) как самого верхнего окна и получить фокус.
Если возможно, хостимое приложение должно изменить свой размер и положение в соответствии с requestedScreenArea. Если requestedScreenArea отсутствует или равно null, хостимое приложение может сохранить текущий размер и положение на экране.
Метод возвращает TRUE, если хостимое приложение получило запрос и выполнит его. В противном случае возвращается FALSE.
Хостимое приложение должно обрабатывать этот метод, если оно находится в состоянии IDLE или INPROGRESS. Хостимое приложение не обязано обрабатывать этот метод, если оно не находится в состоянии IDLE или INPROGRESS.
Хостимое приложение без графического интерфейса (например, приложение анализа без GUI, headless), для которого понятия отображения и получения фокуса не имеют смысла, всегда должно возвращать TRUE из этого метода.
В следующих разделах описаны методы интерфейса Host.
Возвращает вновь созданный UID DICOM, который хостимое приложение может использовать, например, для создания новых объектов данных и структур.
Хостимое приложение передаёт предпочитаемый размер экрана в параметре appPreferredScreen. Хостинговая система может использовать эту информацию как подсказку, но может вернуть расположение и размер окна, которые лучше всего подходят для графического интерфейса хостинговой системы.
Метод возвращает расположение и размер окна, которые хостинговая система предпочла бы использовать для хостимого приложения. Однако нет никаких требований к тому, чтобы хостимое приложение следовало этой информации.
Метод возвращает URI, который хостимое приложение может использовать для хранения выходных данных, предоставляемых хостинговой системе (например, в ответ на вызов getData()).
Хостимое приложение указывает в порядке предпочтения протоколы, которые оно может использовать для хранения данных. Хостимое приложение должно как минимум поддерживать оба протокола: http: и file:. Хостинговая система выбирает наиболее подходящий протокол, потенциально учитывая системные соображения или соображения безопасности, а также порядок предпочтений. Хостинговая система использует выбранный протокол при настройке ресурсов и формировании URI, возвращаемого хостимому приложению.
При использовании протокола http: могут существовать ограничения по сравнению с протоколом file:. Некоторые функции, которые могут работать с протоколом file:, такие как seek, rewrite и delete, могут не работать с протоколом http:. Хостимое приложение должно предполагать, что оно может выполнять запись только однократно в последовательном порядке, если возвращаемое расположение вывода использует протокол http:.
Если для доступа к данным необходима какая-либо аутентификационная информация, она может быть включена в URI.
Хостинговая система должна поддерживать URI активным, пока хостимое приложение находится в любом состоянии, отличном от IDLE или EXIT, или до тех пор, пока хостимое приложение не вернёт URI хостинговой системе (например, в ObjectLocator, возвращаемом хостинговой системе в ответ на вызов getData()). Распоряжение данными, которые хостимое приложение отправляет по этому URI, является ответственностью хостинговой системы после того, как хостимое приложение перейдёт в состояние IDLE или после того, как хостимое приложение вернёт URI хостинговой системе (например, в ObjectLocator, возвращаемом хостинговой системе в ответ на вызов getData()). После перехода хостимого приложения в состояние IDLE хостинговая система не обязана поддерживать URI активным.
Хостимое приложение должно вызывать этот метод только в состояниях INPROGRESS или COMPLETED.
Хостимое приложение должно вызывать этот метод каждый раз при успешном переходе в новое состояние. Новое состояние передаётся в параметре state.
Хостимое приложение может информировать хостинговую систему о примечательных событиях, возникающих во время выполнения, путём вызова этого метода с передачей информации в параметре status.
Интерфейс, используемый для обмена информацией о данных, передаваемых между источником и получателем, является одинаковым как для хостинговой системы, так и для хостимого приложения. Реализации интерфейса Application должны также включать интерфейс DataExchange. Реализации интерфейса Host должны также включать интерфейс DataExchange. Другими словами, интерфейс DataExchange симметричен по отношению к хостинговой системе и хостимому приложению.
Данные, обмениваемые между хостинговой системой и хостимым приложением, могут передаваться либо в виде файлов, либо описываться в моделях, которые могут запрашиваться получателем.
Получатели, способные анализировать объекты DICOM, могут запрашивать методы на основе файлов. Диаграмма последовательности на Рисунке 8.3-1 иллюстрирует один из возможных вариантов обмена с использованием методов на основе файлов.
Преимущество использования методов на основе моделей заключается в том, что получателю не нужно знать, как анализировать форматы данных; вместо этого он может использовать общедоступные инструменты для обработки XML-инфомножеств (XML Infosets) для извлечения данных из моделей.
Интерфейсы на основе моделей могут работать с различными моделями. Конкретные модели идентифицируются UID. Модели могут быть либо абстракцией данных, либо моделью некоторого собственного формата (native format). Модели, определённые стандартом DICOM, описаны в Приложении A. Модели описываются как XML-инфомножества (XML Infosets), даже если исходные данные фактически никогда не представлены в формате XML. Источник, предоставляющий данные, обеспечивает отображение моделей обратно в исходный формат данных.
Абстрактные модели позволяют получателю работать с данными независимо от того, в какой собственной форме (native form) они представлены. Например, данные из различных форматов изображений, таких как DICOM, TIFF, JPEG, NIfTI или Analyze, могут быть включены в абстрактную модель изображений. Получатель затем может работать с данными, даже если он не знает, как данные были представлены в исходном виде. Абстрактные модели могут быть получены из данных, на которые ссылается несколько ObjectDescriptor-ов (например, несколько срезов КТ, объединённых в единый объём).
Абстрактные модели обычно не включают всё многообразие данных, доступное в собственных представлениях. Например, абстрактная модель изображений, полученная из данных DICOM, обычно содержит ссылки на «обработанные» (cooked) данные пикселей и их пространственную организацию, но может не включать многие модality-специфичные атрибуты. Чтобы позволить получателям получить доступ к таким подробностям, поставщик абстрактной модели может предоставить ссылки на ObjectDescriptor-ы в форме UUID, из которых эта абстрактная модель была получена. Получатель может получить доступ к любому атрибуту исходных форматов данных через исходные ObjectDescriptor-ы.
Диаграмма последовательности на Рисунке 8.3-2 иллюстрирует один из возможных вариантов обмена с использованием методов на основе моделей. Она также иллюстрирует возврат частичных результатов хостимым приложением, один из возможных способов использования хостимым приложением метода getOutputLocation(), а также возможные варианты использования методов releaseModel() и releaseData().
Рисунок 8.3-2. Пример последовательности обмена данными на основе моделей (продолжение на следующей странице)
Рисунок 8.3-2b. Пример последовательности обмена данными на основе моделей (продолжение с предыдущей страницы)
Хостинговые системы должны поддерживать как интерфейсы на основе файлов, так и интерфейсы на основе моделей — как в качестве источника данных, так и в качестве получателя.
Хостимые приложения должны поддерживать как минимум один из интерфейсов — на основе файлов или на основе моделей — в качестве источника данных или получателя, в зависимости от нужд хостимого приложения. Если хостимое приложение поддерживает интерфейсы на основе моделей, оно должно поддерживать как минимум одну из моделей, определённых в Приложении A. Хостимые приложения могут реализовать только те части этих интерфейсов, которые они фактически используют; однако все методы интерфейса, которые может вызывать хостинговая система, должны быть доступны для вызова хостинговой системой, даже если хостимое приложение ничего не делает, кроме возврата соответствующего ответа.
В следующих разделах описаны методы интерфейса DataExchange.
Источник данных вызывает этот метод с описаниями доступных данных, которые он может предоставить получателю. Если источник данных ожидает, что станут доступны дополнительные данные, он должен передать FALSE в параметре lastData. В противном случае он должен передать TRUE в параметре lastData и не должен делать дальнейшие вызовы notifyDataAvailable до тех пор, пока не пройдёт через состояние IDLE ещё раз.
Источник данных должен иметь возможность предоставить данные в форме, указанной в структуре AvailableData.
Хостинговая система использует этот метод для информирования хостимого приложения о входных данных, с которыми оно должно работать. Хостимое приложение использует этот метод для информирования хостинговой системы о выходных данных, созданных хостимым приложением.
Метод возвращает TRUE, если получатель данных успешно получил список AvailableData. В противном случае метод возвращает FALSE.
Хостимое приложение, являющееся получателем этого вызова, но не сумевшее получить список AvailableData, может сообщить причину сбоя в вызове метода notifyStatus.
Источник данных не должен включать в AvailableData ссылки на данные, которые были отправлены в предыдущем успешном вызове notifyDataAvailable (т. е. в вызове, который вернул TRUE).
Хостимое приложение не должно переходить в состояние COMPLETED, если оно получило или отправило вызов notifyDataAvailable() с индикатором lastData, равным FALSE.
Источник данных может вызвать notifyDataAvailable() с пустым списком данных.
Вызов notifyDataAvailable() с пустым списком полезен для установки индикатора lastData в TRUE.
Этот метод следует вызывать только если хостимое приложение находится в состоянии INPROGRESS.
Получатель данных вызывает этот метод для получения доступа к двоичным данным, предоставляемым источником данных. Источник данных предоставляет URI, который получатель может открыть как байтовый поток для извлечения данных.
Поставщик данных может отложить фактическую подготовку двоичных данных до момента, когда получатель фактически запросит их.
Массив objectUUIDs содержит UUID двоичных данных, которые источник хочет извлечь. Каждый из UUID в этом массиве взят либо из ObjectDescriptor-ов, предоставленных в структуре AvailableData, полученной получателем в одном или нескольких вызовах метода notifyDataAvailable(), либо из указателей на большие объёмы данных (bulk data pointers) в моделях, к которым получил доступ получатель.
Если UUID получен из ObjectDescriptor, источник возвращает ObjectLocator-ы двоичных объектов, используя MIME-тип содержимого и UID класса, указанные в ObjectDescriptor в структуре AvailableData, связанной с каждым UUID. Если UUID получен из модели обмена данными (Data Exchange Model), источник возвращает двоичные большие объёмы данных (bulk data), описанные в модели.
Получатель указывает желаемый синтаксис передачи (Transfer Syntax) для больших объёмов данных (bulk data) через параметр acceptableTransferSyntaxUIDs. Получатель должен перечислить в порядке предпочтения в параметре acceptableTransferSyntaxUIDs UID синтаксисов передачи, которые он примет для данных, представленных objectUUIDs. Поставщик данных должен выбрать и использовать первый синтаксис передачи из списка, который он поддерживает. Для данных DICOM поставщик данных должен как минимум поддерживать синтаксис передачи Explicit VR Little Endian. acceptableTransferSyntaxUIDs может быть пустым для тех MIME-типов содержимого, для которых понятие синтаксиса передачи не имеет смысла.
При извлечении двоичных данных, идентифицированных UUID из ObjectDescriptor, если получатель устанавливает флаг includeBulkData в TRUE, источник должен предоставить большие объёмы данных (bulk data) в потоке данных. В противном случае источник может, но не обязан, опускать большие объёмы данных, такие как данные пикселей.
Флаг includeBulkData полезен, например, когда получатель хочет работать с описанием данных пикселей в бинарном формате DICOM, чтобы решить, извлекать ли сами данные пикселей.
Метод возвращает один ObjectLocator для каждого UUID, переданного в метод в массиве objectUUIDs. ObjectLocator описывает файл, в котором получатель может прочитать данные, на которые ссылается UUID конкретного объекта.
Когда получатель завершил работу с данными, на которые ссылается URI ObjectLocator, он может вызвать метод releaseData() для освобождения ресурсов, используемых для предоставления этих URI. Любые ссылки на данные, не освобождённые явно получателем данных, освобождаются неявно при переходе хостимого приложения в состояние IDLE.
Получатель может вызывать getData() несколько раз для данных, на которые ссылается данный ObjectDescriptor или UUID больших объёмов данных (bulk data). Каждый вызов getData() должен сопровождаться явным или неявным вызовом releaseData().
Этот метод следует вызывать только если хостимое приложение находится в состояниях INPROGRESS или COMPLETED. Хостинговая система может также вызывать этот метод, когда хостимое приложение находится в состоянии SUSPENDED.
Получатель данных вызывает этот метод, чтобы попросить источник данных предоставить данные, на которые ссылается массив objectUUIDs, в виде моделей типа, на который ссылается classUID. UUID objectUUIDs взяты из ObjectDescriptor-ов, переданных получателю данных в одном или нескольких вызовах notifyDataAvailable().
Получатель данных должен перечислить в supportedInfosetTypes в порядке предпочтения MIME-типы, которые он может обрабатывать как инфомножества (Infosets). Получатели данных должны поддерживать MIME-тип «text/xml», который всегда должен быть включён в массив supportedInfosetTypes. Поставщик данных должен выбрать первую запись в этом массиве, которую он поддерживает.
ModelSetDescriptor, возвращаемый этим методом, содержит UUID моделей, предоставленных источником, а также UUID объектов данных, на которые ссылается массив objectUUIDs, которые не могут быть представлены в запрошенной модели.
Получатель может вызывать getAsModels() несколько раз для данных, на которые ссылается данный UUID. Каждый успешный вызов возвращает другой UUID модели.
Когда получатель завершил работу с набором моделей, он может вызвать метод releaseModels() для освобождения ресурсов, используемых для предоставления этих моделей. Любые модели, не освобождённые явно получателем данных, освобождаются неявно при переходе хостимого приложения в состояние IDLE.
Этот метод следует вызывать только если хостимое приложение находится в состояниях INPROGRESS или COMPLETED. Хостинговая система может также вызывать этот метод, когда хостимое приложение находится в состоянии SUSPENDED.
Получатель данных вызывает этот метод, чтобы запросить у источника данных возврат подмножества данных, указанных в каждой из строк XPath-запроса, переданных в параметре xpath, из каждой модели, идентифицированной UUID, переданными в массиве model. Каждая из строк XPath-запроса применяется к каждой из моделей, на которые ссылается массив model.
UUID, переданные в массиве model, должны быть выбраны из тех, что возвращены одним или несколькими вызовами метода getAsModels().
Результаты запроса возвращаются методом как XML-инфомножества (XML Infosets), закодированные в XML и возвращаемые в виде строки. Каждый результат для конкретного UUID модели возвращается как элемент QueryResult в возвращаемом массиве для каждой строки xpath. Другими словами, количество возвращаемых QueryResult равно количеству UUID в массиве model, умноженному на количество строк XPath-запроса в массиве xpath.
Этот метод следует вызывать только если хостимое приложение находится в состояниях INPROGRESS или COMPLETED. Хостинговая система может также вызывать этот метод, когда хостимое приложение находится в состоянии SUSPENDED.
Получатель данных вызывает этот метод, чтобы запросить у источника данных возврат подмножества данных, указанных в каждой из строк XPath-запроса, переданных в параметре xpath, из каждой модели, идентифицированной UUID, переданными в массиве model. Каждая из строк XPath-запроса применяется к каждой из моделей, на которые ссылается массив model.
UUID, переданные в массиве model, должны быть выбраны из тех, что возвращены одним или несколькими вызовами метода getAsModels().
Результаты запроса возвращаются методом как XML-инфомножества (XML Infosets), закодированные в XML и возвращаемые в виде массива байтов, закодированного в форме, согласованной во время вызова getAsModel(). Каждый результат для конкретного UUID модели возвращается как элемент QueryResultInfoset в возвращаемом массиве для каждой строки xpath. Другими словами, количество возвращаемых структур QueryResultInfoset равно количеству UUID в массиве model, умноженному на количество строк XPath-запроса в массиве xpath.
Этот метод используется главным образом, когда тип инфомножества не является строковым, например «application/fastinfoset». Если вызывается для модели с типом инфомножества «text/xml», потребуется преобразование из массива байтов в строку.
Этот метод следует вызывать только если хостимое приложение находится в состояниях INPROGRESS или COMPLETED. Хостинговая система может также вызывать этот метод, когда хостимое приложение находится в состоянии SUSPENDED.
Получатель данных вызывает этот метод для освобождения доступа к двоичным данным, предоставленным источником данных через вызов getData(). ArrayOfUUID идентифицирует потоки данных, которые получатель освобождает. UUID в этом массиве должны быть взяты из полей locator в ObjectLocator-ах, возвращённых вызовами getData().
Объект-обёртка, представляющий инкапсуляцию массива определённого типа. Используется в параметрах и возвращаемых значениях API-функций для обеспечения кроссплатформенной совместимости. Обёртка содержит единственное поле, которое является массивом хранимого типа. Имя поля — это имя типа с первой буквой в нижнем регистре вместо верхнего.
Структура данных, сообщающая получателю, какие данные доступны. Данные организованы иерархически, сообщая пациентов, исследования, серии и, наконец, ObjectDescriptor-ы, идентифицирующие доступные объекты данных. Поля структуры данных:
Структура данных со следующими полями:
DescriptorUUID : UUID — UUID, который интерфейс использует для отслеживания данного конкретного объекта данных.
MimeType : MimeType — MIME-тип содержимого данного объекта данных в наиболее естественной форме, доступной от источника. Наиболее естественная форма — это обычно форма, в которой источник хранит данные в своей базе данных, например файл DICOM.
ClassUID : UID — UID, представляющий класс данного объекта данных в форме, описываемой mimeType. Для объектов, чей mimeType относится к модели обмена данными, такой как определённые в Приложении A, это UID этой модели. Для объектов, чей mimeType — application/dicom, это SOP Class UID объекта DICOM. Может быть пустым для тех объектов, чьи MIME-типы содержимого не имеют дополнительных классов.
TransferSyntaxUID : UID — UID, представляющий синтаксис передачи (Transfer Syntax) данного объекта данных в форме, описываемой mimeType. Может быть пустым для объектов с MIME-типом содержимого, для которого понятие синтаксиса передачи не имеет смысла.
Modality : String — модальность, наилучшим образом представляющая происхождение данных. Стандартные значения берутся из перечня Defined Terms для атрибута Modality (0008,0060) в Разделе C.7.3.1.1.1 «Modality» в PS3.3 .
Структура данных, сообщающая данные конкретного пациента. Поля структуры данных:
Name : String — имя пациента, отформатированное, как описано для VR PN в PS3.5. Для DICOM SOP Instances это значение атрибута Patient's Name (0010,0010).
ID : String — строка, используемая как идентификатор конкретного пациента, отформатированная, как описано для VR LO в PS3.5. Для DICOM SOP Instances это значение атрибута Patient ID (0010,0020).
AssigningAuthority : String — организация, назначившая идентификатор пациенту, отформатированная, как описано для VR LO в PS3.5. Для DICOM SOP Instances это значение атрибута Issuer of Patient ID (0010,0021).
Sex : String — пол пациента. Для DICOM SOP Instances это значение атрибута Patient's Sex (0010,0040). Во всех остальных случаях он должен принимать значения, допустимые для атрибута DICOM Sex (0010,0040).
BirthDate: String — дата рождения пациента, отформатированная, как описано для VR DA в PS3.5. Для DICOM SOP Instances это значение атрибута Patient's Birth Date (0010,0030).
ObjectDescriptors : ObjectDescriptor[] — массив структур данных ObjectDescriptor, перечисляющий данные, относящиеся к данному пациенту, но не относящиеся к какому-либо конкретному исследованию этого пациента.
Должно присутствовать как минимум одно из полей objectDescriptors или studies.
Структура данных, сообщающая данные конкретного исследования. Поля структуры данных:
StudyUID : UID — UID исследования. Для DICOM SOP Instances это значение атрибута Study Instance UID (0020,000D).
ObjectDescriptors : ObjectDescriptor[] — массив структур данных ObjectDescriptor, перечисляющий данные, относящиеся к данному исследованию (в пределах объемлющего пациента), но не относящиеся к какой-либо конкретной серии в этом исследовании.
Структура данных, сообщающая данные конкретной серии. Поля структуры данных:
SeriesUID : UID — UID серии. Для DICOM SOP Instances это значение атрибута Series Instance UID (0020,000E).
ObjectDescriptors : ObjectDescriptor — массив структур данных ObjectDescriptor, перечисляющий данные, существующие в данной серии (в пределах объемлющего исследования, в пределах объемлющего пациента).
Тип данных, значениями которого являются Defined Terms, идентифицирующие конкретные MIME-типы содержимого. Синтаксис строки, определяющей MIME-тип содержимого, определён в [RFC2045]. Типы MIME верхнего уровня определены в [RFC2046]. MIME-типы содержимого берутся из списка, поддерживаемого Internet Assigned Numbers Authority (IANA), веб-сайт которого находится по адресу http://www.iana.org/assignments/media-types/, как описано в [RFC2048].
Структура данных, возвращаемая методом getAsModels(), со следующими полями:
InfosetType : MimeType — MIME-тип инфомножества, выбранный источником данных из списка, переданного ему получателем в вызове getAsModels().
Models : UUID[] — массив UUID, ссылающихся на модели, созданные из набора объектов данных, на которые ссылается массив UUID, переданный в вызов getAsModels().
FailedSourceObjects : UUID[] — массив UUID, обозначающий объекты данных, на которые ссылается массив UUID, переданный в вызов getAsModels(), которые не могут быть представлены в запрошенном классе моделей.
Например, если массив UUID, переданный в вызов getAsModels(), включает 100 срезов КТ из одной системы координат (т. е. стек объёма), плюс 1 объект GSPS, и если вызывающая сторона запросила модель Abstract Multi-Dimensional Image, то ModelSetDescriptor, возвращённый GetAsModels(), будет включать один UUID в массиве models, идентифицирующий данные объёмного изображения КТ, созданные из 100 срезов КТ, и один UUID в массиве failedSourceObjects, указывающий UUID объекта GSPS.
Структура данных, представляющая расположение, из которого получатель объекта данных может извлечь этот объект. Она состоит из следующих полей:
Locator : UUID — UUID, который интерфейс использует для отслеживания данного конкретного ObjectLocator.
Source : UUID — UUID источника, предоставляющего данные для данного ObjectLocator. Этот UUID совпадает с UUID в ObjectDescriptor при попытке извлечь данные в их естественной форме (например, как файл или байтовый поток). Этот UUID совпадает с UUID в указателе больших объёмов данных (bulk data pointer) при извлечении больших объёмов данных из модели.
TransferSyntax : UID — синтаксис передачи, в котором закодированы данные, выбранный источником данных из списка, переданного получателем данных в параметре acceptableTransferSyntaxUIDs вызова getData(). Может быть пустым для объектов с MIME-типом содержимого, для которого понятие синтаксиса передачи не имеет смысла.
Length: long — длина объекта данных, на который ссылается UUID.
Offset: long — смещение в файле или байтовом потоке, где начинается объект данных.
URI: URI — URI, идентифицирующий ресурс, из которого получатель может извлечь объект данных, обычно, но не исключительно, файл в локальной файловой системе. Получатель должен иметь возможность доступа к данным в объекте с использованием файлового ввода-вывода или отображения в память.
Структура данных, определяющая прямоугольную область на экране дисплея. Поля структуры данных:
определяют положение левого верхнего угла области в экранных координатах, и
задают размеры области. Экранные координаты определяются начиная от начала координат 0,0 в левом верхнем углу экрана и распространяются в положительном направлении вниз и вправо.
State — это перечислимый тип данных со следующими значениями:
Интерпретация этих перечислимых значений определена в разделе 7.2 «Состояния».
Структура данных со следующими полями:
StatusType : StatusType — уровень серьёзности данного сообщения о статусе.
CodingSchemeDesignator : String — схема кодирования (Coding Scheme), в которой определены codeValues. Использование codeValue должно быть согласовано с использованием атрибута DICOM Code Value (0008,0100), как указано в PS3.3.
CodeValue : String — конкретное значение кода в указанной схеме кодирования, представляющее характер данного сообщения о статусе. Использование сообщения должно быть согласовано с использованием атрибута DICOM Code Meaning (0008,0104), как указано в PS3.3.
CodeMeaning : String — отображаемая строка для значения кода. Использование сообщения должно быть согласовано с использованием атрибута DICOM Code Meaning (0008,0104), как указано в PS3.3.
Любое другое поле из макроса кодированной терминологии (Coded Terminology), определённого в Разделе 10.1.
Перечислимый тип данных со следующими значениями и определениями:
INFORMATION — статус предназначен только для информационных целей.
WARNING — указывает на условие, которое может повлиять на скорость или качество работы, выполняемой хостимым приложением, но не препятствует завершению задачи хостимым приложением.
ERROR — указывает на условие, которое может помешать хостимому приложению корректно завершить свою задачу. Хостимое приложение попытается продолжить работу.
FATALERROR — указывает на условие, препятствующее завершению задачи хостимым приложением. Хостимое приложение не будет пытаться продолжить работу и автоматически перейдёт в состояние CANCELED.
Строка разделённых точками цифр, представляющая уникальный идентификатор (Unique Identifier, см. PS3.5), отформатированная, как описано для VR UI в PS3.5.
Строка, представляющая универсальный уникальный идентификатор (Universally Unique Identifier), как определено в [ITU-T X.667], с использованием шестнадцатеричной формы представления.
Структура данных со следующими полями, представляющая результат XPath-запроса к модели, возвращаемый в строковом представлении.
Структура данных со следующими полями, представляющая результат XPath-запроса к модели, возвращаемый в виде массива байтов.
Перечисление типов результатов, которые могут быть возвращены XPath-запросом.
Это перисление совместимо с аналогичным перечислением, используемым в платформе Microsoft .NET.
Root — результат является узлом верхнего уровня XML-инфомножества (т. е. результат — это всё XML-инфомножество).
Element — результат является XML-элементом внутри XML-инфомножества (т. е. результат — это подмножество XML-инфомножества).
Attribute — результат является XML-атрибутом XML-элемента внутри XML-инфомножества.
Text — результат является текстовым содержимым XML-элемента внутри XML-инфомножества. Эквивалентно типам узлов Text и CDATA в объектной модели документа (DOM). Содержит как минимум один символ.
SignificantWhitespace — результат является содержимым XML-элемента внутри XML-инфомножества, где содержимое состоит только из значимых пробелов (например, xml:space установлено в preserve). Кодовые точки пробелов: SPACE (U0020), TAB (U0009), CARRIAGE RETURN (U000D) или LINE FEED (U000A) стандарта ISO 10646 (Unicode).
Whitespace — результат является содержимым XML-элемента внутри XML-инфомножества, где содержимое состоит только из пробелов. Кодовые точки пробелов: SPACE (U0020), TAB (U0009), CARRIAGE RETURN (U000D) или LINE FEED (U000A) стандарта ISO 10646 (Unicode).
Comment — результат является комментарием внутри XML-инфомножества.
Namespace — результат является директивой пространства имён внутри XML-инфомножества.
ProcessingInstruction — результат является инструкцией по обработке внутри XML-инфомножества.
All — результат может содержать любой из типов, определённых в XPathNodeType.
Модели, которые могут использоваться методами интерфейса DataExchange на основе моделей, определены в Приложении A. Эти модели определены в виде XML-схем, написанных в компактной форме Relax NG (Relax NG Compact form) языка DSDL, как указано в [ISO/IEC 19757-2].
Разработчик может преобразовать компактную форму Relax NG в другие формы для использования в своей реализации при условии, что обмениваемые XML-инфомножества будут проходить проверку на соответствие схеме, указанной стандартом. Например, конкретная реализация может внутренне использовать схему с более строгими правилами проверки (например, с использованием правил Schematron, как указано в [ISO/IEC 19757-3], или с использованием языка W3C XML Schema Definition (XSDL) [XSD1] с правилами утверждений) при условии, что XML, созданный для обмена через интерфейс, может быть обработан схемой, указанной в стандарте, и что XML из корректно сформированных объектов DICOM, созданный по схеме, указанной в стандарте, по-прежнему может использоваться внутренней схемой реализации.
Фактические экземпляры моделей — это XML-инфомножества. Приложение A следует приведённым ниже соглашениям при описании моделей.
Модели определены через XML-схемы, чтобы позволить использование общедоступных инструментов для обработки и навигации по модели. Например, инструкция XPath может быть использована для идентификации интересующих частей модели, таких как конкретный атрибут DICOM, и их извлечения.
Некоторые реализации могут анализировать входящий объект напрямую, который может быть не в формате XML, и преобразовывать его во внутреннее представление, такое как объектная модель документа (DOM), без предварительного преобразования объекта в XML.
Внутри каждого описания модели находится таблица XML-элементов и XML-атрибутов, используемых для описания XML-инфомножества этой модели. Эти таблицы используют следующие соглашения:
Имена XML-элементов (указанные в первом столбце) записываются в CamelCase с заглавной первой буквой.
Имена XML-атрибутов (указанные в первом столбце) записываются в camelCase со строчной первой буквой.
Имена XML-элементов и XML-атрибутов с набором символов «>» перед ними вложены в первый предшествующий XML-элемент с на один меньшим количеством символов «>» перед его именем. Вложенный XML-атрибут связан с непосредственно объемлющим XML-элементом.
Значения в столбце «Optionality» (Необязательность) имеют следующую интерпретацию:
«R» означает, что XML-элемент или XML-атрибут является обязательным во всех моделях.
«C» означает, что XML-элемент или XML-атрибут является обязательным во всех моделях при выполнении условия, указанного в описании.
«O» означает, что XML-элемент или XML-атрибут является необязательным.
Если XML-элемент или XML-атрибут вложен в другой XML-элемент, и этот объемлющий XML-элемент отсутствует (т. е. он определён с Optionality «O» и не присутствует в XML-инфомножестве, или он определён с Optionality «RC» и не включён в XML-инфомножество, поскольку условие не было выполнено), то вложенный XML-элемент или XML-атрибут не должен присутствовать в XML-инфомножестве независимо от его необязательности.
Значения в столбце «Cardinality» (Количество) имеют следующую интерпретацию:
«A» означает, что это представлено как XML-атрибут, а не XML-элемент, следовательно, по определению имеет количество, равное 1.
«1» означает, что только один экземпляр этого XML-элемента включён внутри непосредственно объемлющего XML-элемента или на верхнем уровне, если этот XML-элемент не вложен в другой XML-элемент.
«0-n» означает, что от нуля до n экземпляров этого XML-элемента включены внутри непосредственно объемлющего XML-элемента или на верхнем уровне, если этот XML-элемент не вложен в другой XML-элемент.
«1-n» означает, что от одного до n экземпляров этого XML-элемента включены внутри непосредственно объемлющего XML-элемента или на верхнем уровне, если этот XML-элемент не вложен в другой XML-элемент.
Наборы XML-элементов и XML-атрибутов, которые часто повторяются в моделях, могут быть определены как макросы. Макросы, которые могут иметь общую применимость, определены в этом разделе. Макросы, уникальные для конкретной модели, могут быть определены в приложении, относящемся к этой модели. Когда макрос включён в таблицу, это равносильно вставке содержимого таблицы макроса в таблицу, ссылающуюся на макрос. Любой набор символов «>» перед директивой включения макроса в таблицу добавляется перед именами XML-элементов и XML-атрибутов, перечисленных в таблице макроса.
Модели могут использовать кодированную терминологию. Представление кодированной терминологии в DICOM описано в PS3.3. Конкретная терминология, представляющая интерес, организованная в Context Groups в PS3.16, может быть указана с помощью следующего макроса.
Таблица 10.1-1a. Базовый макрос кодированной терминологии
|
Конкретное значение кода, идентифицирующее указанный термин или концепцию. См. Раздел 8.1 в PS3.3 . Один и тот же XML-элемент CodeValue используется независимо от длины или кодировки значения кода. Т.е. отдельные XML-элементы не используются, когда значение получено из Long Code Value (0008,0119) или URN Code Value (0008,0120), а не из Code Value (0008,0100). |
|||
|
Обозначает схему кодирования (Coding Scheme), в которой определён CodeValue. См. Раздел 8.2 в PS3.3 . |
|||
|
См. Раздел 8.2 в PS3.3 . Обязательно, если CodingSchemeDesignator недостаточен для однозначной идентификации CodeValue. В остальных случаях может присутствовать. |
|||
|
Краткое человекочитаемое описание значения кода. См. Раздел 8.3 в PS3.3 . |
Таблица 10.1-1b. Расширенный макрос кодированной терминологии
|
Идентифицирует Context Group, определённый в Mapping Resource, из которого были выбраны значения CodeValue и CodeMeaning или добавлены как расширение Private Context Group. См. Раздел 8.6 в PS3.3 и Раздел 8.7 в PS3.3 . |
|||
|
Уникально идентифицирует Context Group. См. Раздел 8.6 в PS3.3 . |
|||
|
См. Раздел 8.4 в PS3.3 . Обязательно, если присутствует ContextIdentifier. |
|||
|
Уникально идентифицирует Mapping Resource, определяющий Context Group. |
|||
|
Имя Mapping Resource, например имя учреждения или организации. |
|||
|
См. Раздел 8.5 в PS3.3 . Обязательно, если присутствует ContextIdentifier. |
|||
|
Указывает, выбран ли кодированный термин из частного расширения Context Group, идентифицированного в ContextIdentifier. См. Раздел 8.7 в PS3.3 . |
|||
|
См. Раздел 8.7 в PS3.3 . Обязательно, если значение ContextGroupExtensionFlag равно «Y». |
|||
|
Идентифицирует лицо или организацию, создавшую расширение Context Group. См. Раздел 8.7 в PS3.3 . Обязательно, если значение contextGroupExtensionFlag равно «Y». |
Таблица 10.1-1. Макрос кодированной терминологии
| Include Table 10.1-1a | |||
|
Коды, считающиеся эквивалентными создающей системой. См. Раздел 8.9 в PS3.3 . |
|||
| >Include Table 10.1-1a | |||
| >Include Table 10.1-1b | |||
| Include Table 10.1-1b | |||
Компоненты имени лица следуют определениям, приведённым в PS3.5 стандарта DICOM. Описание использования компонентов имени лица в PS3.5 также применяется к этому макросу.
Таблица 10.2-1. Макрос компонентов имени лица
Собственная модель DICOM (Native DICOM Model) определяет представление бинарно-кодированных экземпляров SOP DICOM в виде XML-инфомножеств, что позволяет получателю данных навигировать по бинарному набору данных DICOM с использованием инструментов на основе XML вместо reliance на наборы инструментов, понимающие бинарное кодирование DICOM.
Не предполагается, что эта форма будет использоваться в качестве основы для других применений. Эта форма не использует возможности самопроверки, которые были бы возможны при чистом XML-представлении данных.
Согласно стандарту XML, XML-теги чувствительны к регистру. Соглашение о регистре для элементов — заглавная первая буква, camel case. Соглашение о регистре для атрибутов — строчная первая буква, camel case. Ключевые слова, на которые ссылается XML-схема, используют title case DICOM из определений в PS3.6.
За исключением дополнения до чётной длины в байтах (padding), источник данных, создающий новый экземпляр собственной модели DICOM (Native DICOM Model) (например, результат работы некоторого приложения анализа), должен следовать правилам кодирования DICOM (например, обработке наборов символов) при создании значений для DicomAttribute в экземпляре Native DICOM Model. Значения атрибутов, закодированные в Native DICOM Model, не обязаны дополняться до чётной длины в байтах.
Объекты атрибутов в объекте DICOM JSON Model упорядочены по имени свойства в возрастающем порядке (см. Раздел F.2.2 «Структура объекта DICOM JSON Model» в PS3.18). Элементы в XML-инфосете, следующем определению Native DICOM Model, не обязаны быть упорядоченными.
XML не обязан быть в каноническом представлении (Canonical representation, http://www.w3.org/TR/xml-c14n/).
Атрибут DICOM Specific Character Set (0008,0005), если он присутствует, отражает кодировку символов исходного набора данных DICOM и не указывает кодировку символов XML-инфосета, которая определяется объявлением кодировки инфосета. Этот атрибут DICOM сохраняется как метаданные и может использоваться для восстановления исходного двоичного кодирования DICOM. См. Раздел C.12.1.1.2 в PS3.3 для получения дополнительных сведений.
При преобразовании BulkData с VR, зависящими от набора символов (SH, LO, ST, PN, LT, UC или UT), в XML-представление кодировка соответствует объявленной кодировке символов инфосета. Для InlineBinary и BulkData с VR UN исходное байтовое кодирование сохраняется без преобразования набора символов.
Если InlineBinary или BulkData с VR UN интерпретируется как содержащее строковое содержимое, для определения кодировки символов используется Specific Character Set (0008,0005) исходного набора данных DICOM.
Атрибуты Group Length (gggg,0000) не должны включаться в экземпляр Native DICOM Model.
Получатель данных, преобразующий данные из экземпляра Native DICOM Model обратно в двоично-кодированный объект DICOM, должен скорректировать дополнение до чётной длины в байтах (padding) по мере необходимости, чтобы соответствовать правилам кодирования, указанным в DICOM PS3.5.
MIME-тип содержимого ObjectDescriptors для собственной модели DICOM должен быть «application/x-dicom.native».
UID класса ObjectDescriptors для собственной модели DICOM должен быть «1.2.840.10008.7.1.1».
Поддержка собственной модели DICOM как в качестве источника данных, так и в качестве получателя данных обязательна для всех хостинговых систем, реализующих интерфейс.
Поддержка собственной модели DICOM либо в качестве источника данных, либо в качестве получателя данных необязательна для всех хостимых приложений, реализующих интерфейс.
Диаграмма собственной модели DICOM представлена на Рисунке A.1.4-1.
Таблица A.1.5-1. Собственная модель DICOM
|
Инфосет (Infoset, как определено в Рекомендации W3C XML Information Set "http://www.w3.org/TR/xml-infoset/"), представляющий содержимое набора данных DICOM (DICOM Data Set, как определено в PS3.5). Директива xml:space="preserve" должна быть включена.
|
|||
Таблица A.1.5-2. Макрос набора данных DICOM
|
Ключевое слово (keyword), как определено в PS3.6. |
|||
|
Четырёхзначные шестнадцатеричные значения номеров группы и элемента тега данных (Data Element Tag), дополненные нулями, объединённые в одну строку без разделителя, причём строчные буквы не допускаются. Например, элемент данных (0010,0020) будет иметь тег «00100020». Для частных элементов данных (Private Data Elements) два старших шестнадцатеричных символа номера элемента должны быть 00, поскольку создатель частных атрибутов (Private Creator) передаётся явно, и блок, используемый в кодировании DICOM, не должен передаваться (т.е. частный элемент данных имеет форму gggg00ee). |
|||
|
Представление значения (Value Representation, VR) данного элемента в виде строки из двух прописных символов, как определено в PS3.5 и указанное для этого элемента данных в PS3.6. |
|||
|
Значение элемента данных создателя частных атрибутов (Private Creator Data Element), соответствующее блоку, в котором используется данный частный элемент данных. Требуется для частных элементов данных (Private Data Elements). В остальных случаях присутствовать не должен (т.е. для элементов данных, определённых стандартом DICOM). |
|||
|
Значение из поля значения (Value Field) элемента данных DICOM. Для каждого значения DICOM или элемента последовательности имеется один элемент Value инфосета. Требуется, если представляемый элемент данных DICOM имеет ненулевую длину и ни один из XML-элементов Item, PersonName, InlineBinary или BulkData не присутствует. Не должен использоваться, если VR объемлющего атрибута — SQ или PN. |
|||
|
Порядок, в котором значение встречается в поле значения DICOM (Value Field), в виде числа, монотонно возрастающего начиная с 1 с шагом 1. |
|||
|
Отдельное значение DICOM, закодированное как простые символьные данные. Например, поле значения Decimal String, содержащее два значения, разделённых разделителем, например «0.5\0.4», будет закодировано как два элемента Value инфосета: <Value number="1">0.5</Value> <Value number="2">0.4</Value> Поле значения Code String, содержащее три значения, разделённых разделителем, второе из которых имеет нулевую длину, «MPG\\XR3», будет закодировано как: <Value number="1">MPG</Value> <Value number="2"></Value> <Value number="3"><XR3</Value> Сравните последний пример со случаем поля значения нулевой длины, при котором элементы Value инфосета вообще отсутствуют. Для элементов данных DICOM, у которых VR равен AT, каждое значение должно быть закодировано как четырёхзначные шестнадцатеричные значения номеров группы и элемента тега данных, дополненные нулями, объединённые в одну строку без разделителя, причём строчные буквы не допускаются. Кодировка символов определяется объявлённой для инфосета, независимо от какого-либо DICOM Specific Character Set, и весь необходимый перевод из DICOM Specific Character Set в кодировку инфосета должен быть выполнен. Примечание
|
|||
|
Элемент последовательности DICOM (sequence item), иными словами — вложенный набор данных DICOM. Требуется, если представляемый элемент данных DICOM является последовательностью (имеет VR «SQ») и имеет ненулевую длину. В остальных случаях не допускается. |
|||
|
Порядок, в котором элемент (Item) встречается в последовательности элементов, в виде числа, монотонно возрастающего начиная с 1 с шагом 1. |
|||
|
>>Включить Таблицу A.1.5-2 «Макрос набора данных DICOM» |
Рекурсивно включает набор данных, соответствующий элементу последовательности. |
||
|
Преобразованное в XML представление элемента данных DICOM, содержащего имя (т.е. с VR, равным PN). ПримечаниеРазбор атрибутов с VR PN в XML-представление групп и компонентов имени упрощает создание выражений XPath для извлечения только отдельных частей имён из данных DICOM. Требуется, если представляемый элемент данных DICOM имеет VR PN и ненулевую длину. В остальных случаях не допускается. Применяются правила, определённые в DICOM PS3.5, касающиеся использования алфавитной (Alphabetic), идеографической (Ideographic) и фонетической (Phonetic) групп компонентов имени в атрибуте DICOM с представлением значения PN. |
|||
|
Порядок, в котором PersonName встречается в поле значения DICOM (Value Field), в виде числа, монотонно возрастающего начиная с 1 с шагом 1. |
|||
|
Группа компонентов имени, представленных алфавитными символами (см. определение VR PN в PS3.5). |
|||
|
>>>Включить Таблицу 10.2-1 «Макрос компонентов имени персоны» |
|||
|
Группа компонентов имени, представленных идеографическими символами (см. определение VR PN в PS3.5). |
|||
|
>>>Включить Таблицу 10.2-1 «Макрос компонентов имени персоны» |
|||
|
Группа компонентов имени, представленных фонетическими символами (см. определение VR PN в PS3.5). |
|||
|
>>>Включить Таблицу 10.2-1 «Макрос компонентов имени персоны» |
|||
|
Ссылка на массив данных (blob), который получатель может извлечь с использованием метода GetData(), транзакции извлечения (Retrieve) службы исследований (WADO-RS) PS3.18 или транзакции сохранения (Store) службы исследований (STOW-RS) PS3.18. Требуется, если представляемый элемент данных DICOM имеет ненулевую длину и ни один из XML-элементов Value, Item, InlineBinary или PersonName инфосета не присутствует. Не должен использоваться для элемента данных с VR SQ. Поставщик данных может использовать ссылку BulkData по своему усмотрению, чтобы избежать кодирования большого поля значения DICOM как текста по значению в инфосете. Например, пиксельные данные или таблицы поиска (LUT). Существует единственный элемент BulkData инфосета, представляющий всё поле значения целиком, а не по одному на каждое значение в случае кратности значения (VM) больше одного. ПримечаниеНапример, LUT с 4096 16-битными элементами, которая в DICOM может быть закодирована с VR OW, с VL 8192 и VM 1, или с VR US, с VL 8192 и VM 4096, — оба варианта будут представлены как один элемент BulkData. Все правила (например, порядок байтов и перестановка) из PS3.5 применяются. Примечание
|
|||
|
Идентификатор данной ссылки на объёмные данные (bulk data), отформатированный как UUID с использованием шестнадцатеричного представления, определённого в [ITU-T X.667]. Требуется, если URI BulkData не присутствует. В остальных случаях присутствовать не должен. |
|||
|
HTTP(S) URI для данной ссылки на объёмные данные. Требуется, если NativeDicomModel был:
|
|||
|
Поле значения объемлющего атрибута, закодированное как base64. Требуется, если представляемый элемент данных DICOM: В остальных случаях присутствовать не должен. Существует единственный элемент InlineBinary инфосета, представляющий всё поле значения целиком, а не по одному на каждое значение в случае кратности значения (VM) больше одного. ПримечаниеНапример, LUT с 4096 16-битными элементами, которая в DICOM может быть закодирована с VR OW, с VL 8192 и VM 1, будет представлена как один элемент InlineBinary. Все правила (например, порядок байтов и перестановка) из PS3.5 применяются. ПримечаниеРазработчикам следует обратить особое внимание на правила PS3.5, касающиеся представлений значений OD, OF, OL, OV и OW. |
|||
Нормативная версия схемы Relax NG Compact для собственной модели DICOM (Native DICOM Model) представлена ниже:
default namespace="http://dicom.nema.org/PS3.19/models/NativeDICOM"
# This schema was created as an intermediary, a means of describing
# native binary encoded DICOM objects as XML Infosets, thus allowing
# one to manipulate binary DICOM objects using familiar XML tools.
# As such, the schema is designed to facilitate a simple, mechanical,
# bi-directional translation between binary encoded DICOM and XML-like
# constructs without constraints, and to simplify identifying portions
# of a DICOM object using XPath statements.
#
# Since this schema has minimal type checking, it is neither intended
# to be used for any operation that involves hand coding, nor to
# describe a definitive, fully validating encoding of DICOM concepts
# into XML, as what one might use, for example, in a robust XML
# database system or in XML-based forms, though it may be used
# as a means for translating binary DICOM Objects into such a form
# (e.g., through an XSLT script).
start = element NativeDicomModel { DicomDataSet }
# A DICOM Data Set is as defined in PS3.5. It does not appear
# as an XML Element, since it does not appear in the binary encoded
# DICOM objects. It exists here merely as a documentation aid.
DicomDataSet = DicomAttribute*
DicomAttribute = element DicomAttribute {
Tag, VR, Keyword?, PrivateCreator?,
(BulkData | Value+ | Item+ | PersonName+ | InlineBinary)?
}
BulkData = element BulkData{ UUID | URI }
Value = element Value { Number, xsd:string }
InlineBinary = element InlineBinary { xsd:base64Binary }
Item = element Item { Number, DicomDataSet }
PersonName = element PersonName {
Number,
element Alphabetic { NameComponents }?,
element Ideographic { NameComponents }?,
element Phonetic { NameComponents }?
}
NameComponents =
element FamilyName {xsd:string}?,
element GivenName {xsd:string}?,
element MiddleName {xsd:string}?,
element NamePrefix {xsd:string}?,
element NameSuffix {xsd:string}?
# keyword is the attribute tag from PS3.6
# (derived from the DICOM Attribute's name)
Keyword = attribute keyword { xsd:token }
# canonical XML definition of Hex, with lowercase letters disallowed
Tag = attribute tag { xsd:string{ minLength="8" maxLength="8" pattern="[0-9A-F]{8}" } }
VR = attribute vr { "AE" | "AS" | "AT"| "CS" | "DA" | "DS" | "DT" | "FL" | "FD"
| "IS" | "LO" | "LT" | "OB" | "OD" | "OF" | "OL" | "OV" | "OW" | "PN" | "SH" | "SL"
| "SQ" | "SS" | "ST" | "SV" | "TM" | "UC" | "UI" | "UL" | "UN" | "UR" | "US" | "UT" | "UV" }
PrivateCreator = attribute privateCreator{ xsd:string }
UUID = attribute uuid { xsd:string }
URI = attribute uri { xsd:anyURI }
Number = attribute number { xsd:positiveInteger }
Абстрактная многомерная модель изображений (Abstract Multi-Dimensional Image Model) может использоваться для ссылки на дискретно дискретизированные многомерные данные изображений. Значения выборки могут быть как одинарными (скалярными), так и векторными. Примером может служить изменяющийся во времени ряд трёхмерных изображений, заданный на множественных уровнях энергии. Абстрактная многомерная модель изображений построена по образцу семейства объектов DICOM Enhanced Multi-frame. В математических терминах это любой набор данных, определяемый функцией I (x,y,z,t,…), где (x,y,z,t,…) — измерения, а значение выборки I — либо вектор компонентов, либо скаляр (т. е. один компонент). Основная цель этой модели — позволить приложениям обрабатывать данные изображений без учёта базового формата данных.
При преобразовании экземпляров SOP DICOM в абстрактные многомерные модели изображений поставщик данных должен следовать этим правилам настолько близко, насколько это практически возможно:
Детерминированное поведение не ожидается и не гарантируется при выполнении преобразований между экземплярами SOP DICOM и абстрактными многомерными моделями изображений. Например, для одних и тех же экземпляров SOP DICOM различные хостинговые системы могут создавать абстрактные многомерные модели изображений, отличающиеся в некоторых деталях, таких как единицы измерения значений компонентов или измерения.
Несколько экземпляров SOP DICOM из одной и той же серии, имеющих один и тот же UID системы координат (Frame of Reference UID), должны быть объединены в один экземпляр абстрактной многомерной модели изображений. Экземпляры SOP DICOM из нескольких серий, имеющие один и тот же Frame of Reference UUID, могут быть объединены в один экземпляр абстрактной многомерной модели изображений, если это уместно.
Один экземпляр SOP DICOM не должен разделяться на несколько экземпляров абстрактной многомерной модели изображений.
Система координат, используемая в абстрактной многомерной модели изображений, должна использовать систему координат, определённую объектами DICOM, используемыми при создании экземпляра абстрактной многомерной модели изображений, если это применимо. По возможности система координат и определения измерений (Dimensions), используемые в абстрактной многомерной модели изображений, должны выбираться таким образом, чтобы для преобразования исходных данных в абстрактную многомерную модель изображений не требовалась интерполяция.
Пространственные координаты, такие как Image Position (Patient) (0020,0032), должны быть преобразованы в систему координат, используемую в экземпляре абстрактной многомерной модели изображений.
Пиксельные данные (Pixel Data) должны быть пространственно преобразованы по мере необходимости для соответствия семантике и единицам измерения измерений (Dimensions) абстрактной многомерной модели изображений, в которую помещаются значения пикселей.
Любые встроенные оверлеи (overlays) в атрибуте Pixel Data (7FE0,0010) должны быть удалены из значений пикселей, а значения пикселей должны быть расширены знаком (sign extended) или преобразованы по мере необходимости для соответствия типу данных компонента (Component) абстрактной многомерной модели изображений, в которую помещаются значения пикселей.
Значения пикселей Pixel Data должны быть преобразованы по мере необходимости для соответствия семантике и единицам измерения компонента (Component) абстрактной многомерной модели изображений, в которую помещаются значения пикселей.
Обычно настройки отображения, такие как VOI и Presentation LUT, не используются при создании абстрактных многомерных моделей изображений из экземпляров SOP DICOM. Исключением является случай, когда применение таких LUT необходимо для соответствия семантике и единицам измерения компонента. Modality LUT или Rescale Slope и Intercept часто должны применяться для соответствия семантике и единицам измерения абстрактной многомерной модели изображений.
Любые значения пикселей, соответствующие значениям заполнения пикселей (pixel padding values), должны быть удалены (т.е. установлены в ноль или другое подходящее значение замены), а пространственно соответствующие значения в PixelMapOfValidData должны быть установлены в outValue или значение, отличное от inValue, в зависимости от ситуации.
При преобразовании данных из экземпляра абстрактной многомерной модели изображений в экземпляры SOP DICOM получатель экземпляра абстрактной модели должен преобразовать пиксельные данные обратно в значения, совместимые с собственной формой создаваемых экземпляров SOP DICOM. Это преобразование может включать восстановление информации Modality LUT, вставку значений заполнения пикселей (pixel padding values), преобразование интервалов между пикселями и начал координат и т.д., в соответствии с SOP Class, в который преобразуются данные. При преобразовании одной абстрактной многомерной модели изображений в несколько экземпляров SOP DICOM все экземпляры SOP DICOM должны иметь один и тот же UID системы координат (Frame of Reference UID) (0020,0052), если это допускается SOP Class.
MIME-тип содержимого ObjectDescriptors для абстрактной многомерной модели изображений — «application/x-dicom.abstract».
Это экспериментальный MIME-тип. На формальный MIME-тип будет подана заявка. Ожидается, что реализации будут поддерживать как экспериментальный, так и формальный MIME-тип в дальнейшем без изменения версии интерфейса.
UID класса ObjectDescriptors для абстрактной многомерной модели изображений — «1.2.840.10008.7.1.2».
Поддержка абстрактной многомерной модели изображений как в качестве источника данных, так и в качестве получателя данных обязательна для всех хостинговых систем, реализующих интерфейс.
Поддержка абстрактной многомерной модели изображений либо в качестве источника данных, либо в качестве получателя данных необязательна для всех хостимых приложений, реализующих интерфейс.
Диаграмма абстрактной многомерной модели изображений представлена на Рисунке A.2.4-1.
Таблица A.2.5-1. Абстрактная модель изображений
|
Элемент верхнего уровня, обязательный для всех абстрактных моделей изображений, содержащий весь абстрактный набор данных изображений. |
|||
|
Описывает компонент вывода функции. Если вывод является скаляром, имеется только один Component. Векторные выходы требуют Component для каждой позиции в векторе. При наличии нескольких компонентов они появляются в каждом значении в порядке, определённом их соответствующими idNumber. |
|||
|
Идентифицирует данный компонент, с нумерацией, монотонно возрастающей начиная с 1. |
|||
|
Описывает, как представлено значение данного компонента. Перечислимые значения: |
|||
|
Минимальное значение, которое принимает данный компонент. Если этот XML-атрибут отсутствует, это минимальное значение, которое может быть представлено данным типом данных (Datatype). |
|||
|
Максимальное значение, которое принимает данный компонент. Если этот XML-атрибут отсутствует, это максимальное значение, которое может быть представлено данным типом данных (Datatype). |
|||
|
Кодированное значение, описывающее, что представляет данный компонент. |
|||
|
>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7180 “Abstract Multi-dimensional Image Model Component Semantic”. |
||
|
Кодированное значение, описывающее единицы измерения данного измерения. |
|||
|
>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7181 “Abstract Multi-dimensional Image Model Component Unit”. |
||
|
Идентифицирует данное измерение, с нумерацией, начиная с 1. Измерения с меньшим idNumber изменяются быстрее, чем измерения с большим idNumber. |
|||
|
Количество выборок в данном измерении, например: количество столбцов вдоль оси X, количество строк вдоль оси Y, количество срезов вдоль оси Z, количество качественных описаний. |
|||
|
Кодированное значение, описывающее, что представляет данное измерение. |
|||
|
>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7182 “Abstract Multi-dimensional Image Model Dimension Semantic” |
||
|
Используется для описания равномерно расположенных выборок в данном измерении. Требуется, если не присутствуют ни Irregular, ни Qualitative. В остальных случаях присутствовать не должен. |
|||
|
Кодированное значение, описывающее единицы измерения ширины и интервала выборок. |
|||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7183 “Abstract Multi-dimensional Image Model Dimension Unit”. |
||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7184 “Abstract Multi-dimensional Image Model Axis Direction” |
||
|
Ориентация оси данного измерения, вдоль которой значения возрастают. |
|||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7185 “Abstract Multi-dimensional Image Model Axis Orientation” |
||
|
Используется для описания неравномерно расположенных выборок в данном измерении. Требуется, если не присутствуют ни Regular, ни Qualitative. В остальных случаях присутствовать не должен. |
|||
|
Эталонное положение, от которого измеряется расположение каждой выборки. |
|||
|
Описывает расположение каждой выборки как смещение от начала координат. В данной последовательности должно быть numberOfSamples XML-элементов SampleLocation. |
|||
|
Значение индекса данного расположения выборки, с нумерацией, начиная с 1 и увеличиваясь до numberOfSamples. |
|||
|
Расстояние от данного расположения выборки до положения Origin. |
|||
|
Кодированное значение, описывающее единицы измерения ширины и расположения выборок. |
|||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7183 “Abstract Multi-dimensional Image Model Dimension Unit”. |
||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7184 “Abstract Multi-dimensional Image Model Axis Direction” |
||
|
Ориентация оси данного измерения, вдоль которой значения возрастают. |
|||
|
>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7185 “Abstract Multi-dimensional Image Model Axis Orientation” |
||
|
Используется для описания качественного измерения. Требуется, если не присутствуют ни Regular, ни Irregular. В остальных случаях присутствовать не должен. |
|||
|
Описание того, что представляет каждая выборка вдоль данного измерения. В данной последовательности должно быть numberOfSamples XML-элементов Sample. |
|||
|
Значение индекса данной выборки, с нумерацией, начиная с 1 и увеличиваясь до numberOfSamples. |
|||
|
Кодированное значение, описывающее, что представляет данная выборка. |
|||
|
>>>>>Включить Таблицу 10.1-1 «Макрос кодированной терминологии» |
Определено CID 7186 “Abstract Multi-dimensional Image Model Qualitative Dimension Sample Semantic” |
||
|
Указывает пространственное положение в системе координат абстрактной многомерной модели изображений для пространственных кадров или объёмов значений данных изображений. Различные кадры или объёмы могут либо иметь общее начало координат, либо иметь своё начало для каждого кадра или объёма. Если в данном измерении присутствует только один XML-элемент Origin, то этот Origin применяется ко всем выборкам вдоль данного измерения. В противном случае должно быть numberOfSamples XML-элементов Origin, по одному для каждой выборки вдоль данного измерения. Значения индексов выборок для измерений, чьи idNumber меньше idNumber данного измерения, все равны 1. |
|||
|
Индекс выборки, к которой применяется данный Origin. Если это единственный Origin, применяемый ко всем выборкам вдоль данного измерения, то index может быть опущен или иметь значение «0» (ноль). В противном случае значение должно быть соответствующим числом от 1 до numberOfSamples. |
|||
|
Позиция X данного Origin в системе координат абстрактной многомерной модели изображений. |
|||
|
Позиция Y данного Origin в системе координат абстрактной многомерной модели изображений. |
|||
|
Позиция Z данного Origin в системе координат абстрактной многомерной модели изображений. |
|||
|
Указывает направление в системе координат абстрактной многомерной модели изображений для измерения, чей idNumber указан в concernedSpatialDimension. idNumber измерения concernedSpatialDimension должен быть меньше idNumber данного измерения. Если в данном XML-элементе измерения присутствует только один XML-элемент DirectionCosines с конкретным concernedSpatialDimension, то этот направляющий косинус применяется ко всем выборкам вдоль данного измерения. В противном случае должно быть numberOfSamples XML-элементов DirectionCosines с данным concernedSpatialDimension, по одному для каждой выборки вдоль данного измерения. |
|||
|
idNumber конкретного измерения, к которому применяется данный XML-элемент DirectionCosines. Значение concernedSpatialDimension должно быть меньше idNumber данного измерения. |
|||
|
Индекс данной спецификации направления, с нумерацией, начиная с 1. Если это однозначный DirectionCosines, применяемый ко всем выборкам вдоль данного измерения, то index может быть опущен или иметь значение «0» (ноль). В противном случае значение index относится к DirectionCosines конкретного значения выборки вдоль данного измерения. |
|||
|
Направляющий косинус вдоль оси X системы координат абстрактной многомерной модели изображений для данного concernedSpatialDimension. |
|||
|
Направляющий косинус вдоль оси Y системы координат абстрактной многомерной модели изображений для данного concernedSpatialDimension. |
|||
|
Направляющий косинус вдоль оси Z системы координат абстрактной многомерной модели изображений для данного concernedSpatialDimension. |
|||
|
Структура, определяющая расположение пиксельных данных, организованных по измерениям. |
|||
|
>>Включить Таблицу A.2.5-2 «Макрос размерных данных» |
|||
|
Карта пикселей, определяющая, какие пиксели принадлежат набору данных, а какие — нет. Размерности карты пикселей соответствуют размерностям данных изображения, т.е. существует однозначное соответствие между выборками в данных изображения и выборками в карте пикселей. Указатели на данные карты пикселей включены в один из XML-элементов Dimension. |
|||
|
Описывает, как кодируются выборки в карте пикселей. Перечислимые значения: Для BIT1 порядок битов начинается с младшего бита и идёт к старшему биту в байте UNSIGNED_INT8 (т.е. 8-битном). Биты дополняются нулями для формирования полного 8-битного байта в конце наиболее быстро изменяющегося измерения (т.е. измерения, чей idNumber равен 1). |
|||
|
Значение в карте пикселей, указывающее, что данная выборка должна считаться частью набора данных. Все выборки, значения карты пикселей которых не совпадают с inValue, не считаются частью набора данных. Требуется, если outValue не присутствует. Не должен присутствовать, если outValue присутствует. |
|||
|
Значение в карте пикселей, указывающее, что данная выборка не должна считаться частью набора данных. Все выборки, значения карты пикселей которых не совпадают с outValue, считаются частью набора данных. Требуется, если inValue не присутствует. Не должен присутствовать, если inValue присутствует. |
|||
|
>>Включить Таблицу A.2.5-2 «Макрос размерных данных» |
|||
Таблица A.2.5-2. Макрос размерных данных
|
idNumber измерения в данном AbstractImageDataSet, к которому относится данный DimensionalData. |
|||
|
Ссылки на расположение данных изображения. Только один XML-элемент Dimension в данном AbstractImageDataSet должен иметь UUID для объёмных пиксельных данных (т.е. все ссылки на объёмные данные находятся на одном и том же размерном уровне). ПримечаниеЕсли источник данных в рамках подготовки модели создаёт один файл для пиксельных данных из нескольких меньших собственных объектов, то для предоставления XML-атрибутов descriptorUUID источнику может потребоваться создать несколько bulkDataUUID, ссылающихся на различные смещения в этом единственном файле пиксельных данных. |
|||
|
Порядковая позиция (например, номер индекса) данной точки выборки в массиве данных на этом уровне. Нумерация начинается с 1. |
|||
|
UUID, ссылающийся на ObjectDescriptor, из которого получены данные, в шестнадцатеричном представлении, определённом в [ITU-T X.667]. Требуется на уровне вложенной древовидной структуры, где источник добавил данные из descriptorUUID в абстрактную многомерную модель изображений. |
|||
|
Идентификатор, который получатель данных может использовать в вызове getData() для получения доступа к объёмным пиксельным данным, отформатированный как UUID с использованием шестнадцатеричного представления, определённого в [ITU-T X.667]. Требуется, если макрос Dimensional Data не присутствует на данном уровне вложенной древовидной структуры. В остальных случаях присутствовать не должен. |
|||
|
>>Условно включить Таблицу A.2.5-2 «Макрос размерных данных» |
На каждом уровне должен быть включён только один из bulkDataUUID или Dimensional Data. Если включается Dimensional Data, это должен быть следующий нижний уровень вложенной древовидной структуры, то есть измерение с idNumber на единицу меньше, чем измерение, на которое ссылается объемлющий DimensionalData. |
||
Схема Relax NG Compact для абстрактной многомерной модели изображений представлена ниже:
default namespace = "http://dicom.nema.org/PS3.19/models/AbstractImage"
start = AbstractImageDataSet
AbstractImageDataSet =
element AbstractImageDataSet {
element Component{
attribute idNumber { xsd:positiveInteger },
attribute datatype { ComponentDatatype },
attribute minValue { xsd:double }?,
attribute maxValue { xsd:double }?,
element Semantics { CodedTerm },
element Unit { CodedTerm }
}+,
element Dimension {
attribute idNumber { xsd:positiveInteger },
attribute numberOfSamples { xsd:positiveInteger },
element Semantics { CodedTerm },
(element Regular {
attribute width { xsd:double },
attribute spacing { xsd:double },
element Unit { CodedTerm },
element AxisDirection { CodedTerm }?,
element AxisOrientation { CodedTerm }?
}
| element Irregular {
attribute origin { xsd:double },
element SampleLocation {
attribute index { xsd:positiveInteger },
attribute width { xsd:double },
attribute distanceToOrigin { xsd:double }
}+,
element Unit { CodedTerm },
element AxisDirection { CodedTerm }?,
element AxisOrientation { CodedTerm }?
}
| element Qualitative {
element Sample {
attribute index { xsd:positiveInteger },
element Semantics { CodedTerm }
}+
}),
element Origin {
attribute index { xsd:nonNegativeInteger }?,
attribute xCoord { xsd:double },
attribute yCoord { xsd:double },
attribute zCoord { xsd:double }
}*,
element DirectionCosines {
attribute concernedSpatialDimension { xsd:positiveInteger },
attribute index { xsd:nonNegativeInteger }?,
attribute cosAlongX { xsd:double },
attribute cosAlongY { xsd:double },
attribute cosAlongZ { xsd:double }
}*
}+,
element PixelData { DimensionalData },
element PixelMapOfValidData {
attribute datatype { PixelMapDatatype },
(
attribute inValue { xsd:positiveInteger }
| attribute outValue { xsd:positiveInteger }
),
DimensionalData
}?
}
ComponentDatatype =
"SIGNED_INT8"
| "SIGNED_INT16"
| "SIGNED_INT32"
| "UNSIGNED_INT8"
| "UNSIGNED_INT16"
| "UNSIGNED_INT32"
| "FLOAT32"
| "FLOAT64"
PixelMapDatatype =
"BIT1"
| "UNSIGNED_INT8"
DimensionalData =
element DimensionalData {
attribute dimensionID { xsd:positiveInteger },
element DataAt
{
attribute indexWithinDimension { xsd:positiveInteger },
attribute descriptorUUID { xsd:string }?,
(DimensionalData | BulkDataPointer)
}+
}
BulkDataPointer =
attribute bulkDataUUID { xsd:string }
CodedTerm =
element CodeValue { xsd:string },
element CodingSchemeDesignator { xsd:string },
element CodingSchemeVersion { xsd:string }?,
element CodeMeaning { xsd:string }?,
(
element ContextIdentifier { xsd:string },
element ContextUID { xsd:string }?,
element MappingResource { xsd:string },
element MappingResourceUID { xsd:string }?,
element ContextGroupVersion { xsd:string }
)?,
(
element ContextGroupExtensionFlag { xsd:string },
element ContextGroupLocalVersion { xsd:string }?,
element ContextGroupExtensionCreatorUID { xsd:string }?
)?
В данном конкретном случае имеется три измерения: №1 для смещений вдоль X, №2 для смещений вдоль Y и №3 для индексации временного ряда. Если имеется 200 изображений по времени (т.е. XML-атрибут numberOfSamples установлен в 200), то будет 400 вхождений XML-элемента DirectionCosines в XML-элементе Dimension, XML-атрибут idNumber которого установлен в №3 (измерение, относящееся ко времени). Первые 200 вхождений будут иметь XML-атрибут concernedSpatialDimension со значением №1 (для задания направляющих косинусов вдоль оси X) и будут индексироваться XML-атрибутом index, изменяющимся от 1 до 200, что соответствует 200 изображениям по времени. Следующие 200 вхождений будут иметь XML-атрибут concernedSpatialDimension со значением №2 (для задания направляющих косинусов вдоль оси Y) и также будут индексироваться XML-атрибутом index, изменяющимся от 1 до 200.
Аналогично, в данном примере будет 200 вхождений XML-элемента Origin в XML-элементе Dimension, XML-атрибут idNumber которого установлен в значение 3, и, конечно же, индексируемых XML-атрибутом index, изменяющимся от 1 до 200.
Ниже представлено содержимое ApplicationService-20100825.wsdl:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions name="ApplicationService-20100825"
targetNamespace="http://dicom.nema.org/PS3.19/ApplicationService-20100825"
xmlns:tns="http://dicom.nema.org/PS3.19/ApplicationService-20100825"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xsd:schema targetNamespace="http://dicom.nema.org/PS3.19/Imports/ApplicationService-20100825">
<xsd:import namespace="http://dicom.nema.org/PS3.19/ApplicationService-20100825"
schemaLocation="./ApplicationService-20100825.xsd" />
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/"
schemaLocation="./Types.xsd" />
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
schemaLocation="./ArrayOfString.xsd" />
<xsd:import namespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
schemaLocation="./XPathNodeType.xsd" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="IApplicationService_GetState_InputMessage">
<wsdl:part name="parameters" element="tns:GetState" />
</wsdl:message>
<wsdl:message name="IApplicationService_GetState_OutputMessage">
<wsdl:part name="parameters" element="tns:GetStateResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_SetState_InputMessage">
<wsdl:part name="parameters" element="tns:SetState" />
</wsdl:message>
<wsdl:message name="IApplicationService_SetState_OutputMessage">
<wsdl:part name="parameters" element="tns:SetStateResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_BringToFront_InputMessage">
<wsdl:part name="parameters" element="tns:BringToFront" />
</wsdl:message>
<wsdl:message name="IApplicationService_BringToFront_OutputMessage">
<wsdl:part name="parameters" element="tns:BringToFrontResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_NotifyDataAvailable_InputMessage">
<wsdl:part name="parameters" element="tns:NotifyDataAvailable" />
</wsdl:message>
<wsdl:message name="IApplicationService_NotifyDataAvailable_OutputMessage">
<wsdl:part name="parameters" element="tns:NotifyDataAvailableResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_GetData_InputMessage">
<wsdl:part name="parameters" element="tns:GetData" />
</wsdl:message>
<wsdl:message name="IApplicationService_GetData_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_ReleaseData_InputMessage">
<wsdl:part name="parameters" element="tns:ReleaseData" />
</wsdl:message>
<wsdl:message name="IApplicationService_ReleaseData_OutputMessage">
<wsdl:part name="parameters" element="tns:ReleaseDataResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_GetAsModels_InputMessage">
<wsdl:part name="parameters" element="tns:GetAsModels" />
</wsdl:message>
<wsdl:message name="IApplicationService_GetAsModels_OutputMessage">
<wsdl:part name="parameters" element="tns:GetAsModelsResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_ReleaseModels_InputMessage">
<wsdl:part name="parameters" element="tns:ReleaseModels" />
</wsdl:message>
<wsdl:message name="IApplicationService_ReleaseModels_OutputMessage">
<wsdl:part name="parameters" element="tns:ReleaseModelsResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_QueryModel_InputMessage">
<wsdl:part name="parameters" element="tns:QueryModel" />
</wsdl:message>
<wsdl:message name="IApplicationService_QueryModel_OutputMessage">
<wsdl:part name="parameters" element="tns:QueryModelResponse" />
</wsdl:message>
<wsdl:message name="IApplicationService_QueryInfoSet_InputMessage">
<wsdl:part name="parameters" element="tns:QueryInfoSet" />
</wsdl:message>
<wsdl:message name="IApplicationService_QueryInfoSet_OutputMessage">
<wsdl:part name="parameters" element="tns:QueryInfoSetResponse" />
</wsdl:message>
<wsdl:portType name="IApplicationService-20100825">
<wsdl:operation name="GetState">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetState"
message="tns:IApplicationService_GetState_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetStateResponse"
message="tns:IApplicationService_GetState_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="SetState">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/SetState"
message="tns:IApplicationService_SetState_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/SetStateResponse"
message="tns:IApplicationService_SetState_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="BringToFront">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/BringToFront"
message="tns:IApplicationService_BringToFront_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/BringToFrontResponse"
message="tns:IApplicationService_BringToFront_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="NotifyDataAvailable">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/NotifyDataAvailable"
message="tns:IApplicationService_NotifyDataAvailable_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/NotifyDataAvailableResponse"
message="tns:IApplicationService_NotifyDataAvailable_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetData">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetData"
message="tns:IApplicationService_GetData_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetDataResponse"
message="tns:IApplicationService_GetData_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="ReleaseData">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseData"
message="tns:IApplicationService_ReleaseData_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseDataResponse"
message="tns:IApplicationService_ReleaseData_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetAsModels">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetAsModels"
message="tns:IApplicationService_GetAsModels_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/GetAsModelsResponse"
message="tns:IApplicationService_GetAsModels_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="ReleaseModels">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseModels"
message="tns:IApplicationService_ReleaseModels_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseModelsResponse"
message="tns:IApplicationService_ReleaseModels_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="QueryModel">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/QueryModel"
message="tns:IApplicationService_QueryModel_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/QueryModelResponse"
message="tns:IApplicationService_QueryModel_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="QueryInfoSet">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/QueryInfoSet"
message="tns:IApplicationService_QueryInfoSet_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IApplicationService/QueryInfoSetResponse"
message="tns:IApplicationService_QueryInfoSet_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ApplicationService-20100825Binding"
type="tns:IApplicationService-20100825">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetState">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/GetState"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SetState">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/SetState"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="BringToFront">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/BringToFront"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="NotifyDataAvailable">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/NotifyDataAvailable"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetData">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/GetData"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ReleaseData">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseData"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAsModels">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/GetAsModels"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ReleaseModels">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/ReleaseModels"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="QueryModel">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/QueryModel"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="QueryInfoSet">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IApplicationService/QueryInfoSet"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ApplicationService-20100825">
<wsdl:port name="ApplicationServiceBinding"
binding="tns:ApplicationService-20100825Binding">
<soap:address location="http://localhost/Service" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Ниже представлено содержимое ApplicationService-20100825.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://dicom.nema.org/PS3.19/ApplicationService-20100825"
elementFormDefault="qualified"
targetNamespace="http://dicom.nema.org/PS3.19/ApplicationService-20100825"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
<xs:import namespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath" />
<xs:element name="GetState">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="GetStateResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetStateResult" type="tns:State" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="State">
<xs:restriction base="xs:string">
<xs:enumeration value="IDLE" />
<xs:enumeration value="INPROGRESS" />
<xs:enumeration value="SUSPENDED" />
<xs:enumeration value="COMPLETED" />
<xs:enumeration value="CANCELED" />
<xs:enumeration value="EXIT" />
</xs:restriction>
</xs:simpleType>
<xs:element name="State" nillable="true" type="tns:State" />
<xs:element name="SetState">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="state" type="tns:State" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SetStateResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SetStateResult" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="BringToFront">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="location" nillable="true"
type="tns:Rectangle" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Rectangle">
<xs:sequence>
<xs:element minOccurs="0" name="Height" type="xs:int" />
<xs:element minOccurs="0" name="Width" type="xs:int" />
<xs:element minOccurs="0" name="RefPointX" type="xs:int" />
<xs:element minOccurs="0" name="RefPointY" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:element name="Rectangle" nillable="true" type="tns:Rectangle" />
<xs:element name="BringToFrontResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="BringToFrontResult"
type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="NotifyDataAvailable">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="data" nillable="true"
type="tns:AvailableData" />
<xs:element minOccurs="0" name="lastData" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="AvailableData">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Patients" nillable="true"
type="tns:ArrayOfPatient" />
</xs:sequence>
</xs:complexType>
<xs:element name="AvailableData" nillable="true" type="tns:AvailableData" />
<xs:complexType name="ArrayOfObjectDescriptor">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="ObjectDescriptor"
nillable="true" type="tns:ObjectDescriptor" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfObjectDescriptor" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:complexType name="ObjectDescriptor">
<xs:sequence>
<xs:element minOccurs="0" name="ClassUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="MimeType" nillable="true"
type="tns:MimeType" />
<xs:element minOccurs="0" name="Modality" nillable="true"
type="tns:Modality" />
<xs:element minOccurs="0" name="TransferSyntaxUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="DescriptorUuid" nillable="true"
type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectDescriptor" nillable="true"
type="tns:ObjectDescriptor" />
<xs:complexType name="UID">
<xs:sequence>
<xs:element minOccurs="0" name="Uid" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="UID" nillable="true" type="tns:UID" />
<xs:complexType name="MimeType">
<xs:sequence>
<xs:element minOccurs="0" name="Type" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="MimeType" nillable="true" type="tns:MimeType" />
<xs:complexType name="Modality">
<xs:sequence>
<xs:element minOccurs="0" name="Modality" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="Modality" nillable="true" type="tns:Modality" />
<xs:complexType name="UUID">
<xs:sequence>
<xs:element minOccurs="0" name="Uuid" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="UUID" nillable="true" type="tns:UUID" />
<xs:complexType name="ArrayOfPatient">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Patient"
nillable="true" type="tns:Patient" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfPatient" nillable="true"
type="tns:ArrayOfPatient" />
<xs:complexType name="Patient">
<xs:sequence>
<xs:element minOccurs="0" name="AssigningAuthority" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="DateOfBirth" type="xs:dateTime" />
<xs:element minOccurs="0" name="ID" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Sex" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Studies" nillable="true"
type="tns:ArrayOfStudy" />
</xs:sequence>
</xs:complexType>
<xs:element name="Patient" nillable="true" type="tns:Patient" />
<xs:complexType name="ArrayOfStudy">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Study"
nillable="true" type="tns:Study" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfStudy" nillable="true" type="tns:ArrayOfStudy" />
<xs:complexType name="Study">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Series" nillable="true"
type="tns:ArrayOfSeries" />
<xs:element minOccurs="0" name="StudyUID" nillable="true"
type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="Study" nillable="true" type="tns:Study" />
<xs:complexType name="ArrayOfSeries">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Series"
nillable="true" type="tns:Series" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfSeries" nillable="true" type="tns:ArrayOfSeries" />
<xs:complexType name="Series">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="SeriesUID" nillable="true"
type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="Series" nillable="true" type="tns:Series" />
<xs:element name="NotifyDataAvailableResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="NotifyDataAvailableResult"
type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="acceptableTransferSyntaxes"
nillable="true" type="tns:ArrayOfUID" />
<xs:element minOccurs="0" name="includeBulkData" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfUUID">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="UUID"
nillable="true" type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfUUID" nillable="true" type="tns:ArrayOfUUID" />
<xs:complexType name="ArrayOfUID">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="UID"
nillable="true" type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfUID" nillable="true" type="tns:ArrayOfUID" />
<xs:element name="GetDataResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetDataResult" nillable="true"
type="tns:ArrayOfObjectLocator" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfObjectLocator">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="ObjectLocator"
nillable="true" type="tns:ObjectLocator" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfObjectLocator" nillable="true"
type="tns:ArrayOfObjectLocator" />
<xs:complexType name="ObjectLocator">
<xs:sequence>
<xs:element minOccurs="0" name="Length" type="xs:long" />
<xs:element minOccurs="0" name="Offset" type="xs:long" />
<xs:element minOccurs="0" name="TransferSyntax" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="URI" nillable="true" type="xs:anyURI" />
<xs:element minOccurs="0" name="Locator" nillable="true"
type="tns:UUID" />
<xs:element minOccurs="0" name="Source" nillable="true"
type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectLocator" nillable="true" type="tns:ObjectLocator" />
<xs:element name="ReleaseData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReleaseDataResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="GetAsModels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="classUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="supportedInfoSetTypes" nillable="true"
type="tns:ArrayOfMimeType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfMimeType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="MimeType"
nillable="true" type="tns:MimeType" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfMimeType" nillable="true"
type="tns:ArrayOfMimeType" />
<xs:element name="GetAsModelsResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetAsModelsResult" nillable="true"
type="tns:ModelSetDescriptor" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ModelSetDescriptor">
<xs:sequence>
<xs:element minOccurs="0" name="FailedSourceObjects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="InfosetType" nillable="true"
type="tns:MimeType" />
<xs:element minOccurs="0" name="Models" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ModelSetDescriptor" nillable="true"
type="tns:ModelSetDescriptor" />
<xs:element name="ReleaseModels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReleaseModelsResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="QueryModel">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="xPaths" nillable="true"
xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
type="q1:ArrayOfstring" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="QueryModelResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="QueryModelResult" nillable="true"
type="tns:ArrayOfQueryResult" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfQueryResult">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="QueryResult"
nillable="true" type="tns:QueryResult" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfQueryResult" nillable="true"
type="tns:ArrayOfQueryResult" />
<xs:complexType name="QueryResult">
<xs:sequence>
<xs:element minOccurs="0" name="Model" nillable="true" type="tns:UUID" />
<xs:element minOccurs="0" name="Result" nillable="true"
type="tns:ArrayOfXPathNode" />
<xs:element minOccurs="0" name="XPath" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="QueryResult" nillable="true" type="tns:QueryResult" />
<xs:complexType name="ArrayOfXPathNode">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="XPathNode"
nillable="true" type="tns:XPathNode" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfXPathNode" nillable="true"
type="tns:ArrayOfXPathNode" />
<xs:complexType name="XPathNode">
<xs:sequence>
<xs:element minOccurs="0" name="NodeType"
xmlns:q2="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
type="q2:XPathNodeType" />
<xs:element minOccurs="0" name="Value" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="XPathNode" nillable="true" type="tns:XPathNode" />
<xs:element name="QueryInfoSet">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="xPaths" nillable="true"
xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
type="q3:ArrayOfstring" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="QueryInfoSetResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="QueryInfoSetResult" nillable="true"
type="tns:ArrayOfQueryResultInfoSet" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfQueryResultInfoSet">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="QueryResultInfoSet"
nillable="true" type="tns:QueryResultInfoSet" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfQueryResultInfoSet" nillable="true"
type="tns:ArrayOfQueryResultInfoSet" />
<xs:complexType name="QueryResultInfoSet">
<xs:sequence>
<xs:element minOccurs="0" name="Model" nillable="true" type="tns:UUID" />
<xs:element minOccurs="0" name="Result" nillable="true"
type="tns:ArrayOfXPathNodeInfoSet" />
<xs:element minOccurs="0" name="XPath" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="QueryResultInfoSet" nillable="true"
type="tns:QueryResultInfoSet" />
<xs:complexType name="ArrayOfXPathNodeInfoSet">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="XPathNodeInfoSet"
nillable="true" type="tns:XPathNodeInfoSet" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfXPathNodeInfoSet" nillable="true"
type="tns:ArrayOfXPathNodeInfoSet" />
<xs:complexType name="XPathNodeInfoSet">
<xs:sequence>
<xs:element minOccurs="0" name="InfoSetValue" nillable="true"
type="xs:base64Binary" />
<xs:element minOccurs="0" name="NodeType"
xmlns:q4="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
type="q4:XPathNodeType" />
</xs:sequence>
</xs:complexType>
<xs:element name="XPathNodeInfoSet" nillable="true"
type="tns:XPathNodeInfoSet" />
</xs:schema>
Ниже представлено содержимое XPathNodeType.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
elementFormDefault="qualified"
targetNamespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="XPathNodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Root" />
<xs:enumeration value="Element" />
<xs:enumeration value="Attribute" />
<xs:enumeration value="Namespace" />
<xs:enumeration value="Text" />
<xs:enumeration value="SignificantWhitespace" />
<xs:enumeration value="Whitespace" />
<xs:enumeration value="ProcessingInstruction" />
<xs:enumeration value="Comment" />
<xs:enumeration value="All" />
</xs:restriction>
</xs:simpleType>
<xs:element name="XPathNodeType" nillable="true" type="tns:XPathNodeType" />
</xs:schema>
Ниже представлено содержимое Types.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="anyType" nillable="true" type="xs:anyType" />
<xs:element name="anyURI" nillable="true" type="xs:anyURI" />
<xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
<xs:element name="boolean" nillable="true" type="xs:boolean" />
<xs:element name="byte" nillable="true" type="xs:byte" />
<xs:element name="dateTime" nillable="true" type="xs:dateTime" />
<xs:element name="decimal" nillable="true" type="xs:decimal" />
<xs:element name="double" nillable="true" type="xs:double" />
<xs:element name="float" nillable="true" type="xs:float" />
<xs:element name="int" nillable="true" type="xs:int" />
<xs:element name="long" nillable="true" type="xs:long" />
<xs:element name="QName" nillable="true" type="xs:QName" />
<xs:element name="short" nillable="true" type="xs:short" />
<xs:element name="string" nillable="true" type="xs:string" />
<xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
<xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
<xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
<xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
<xs:element name="char" nillable="true" type="tns:char" />
<xs:simpleType name="char">
<xs:restriction base="xs:int" />
</xs:simpleType>
<xs:element name="duration" nillable="true" type="tns:duration" />
<xs:simpleType name="duration">
<xs:restriction base="xs:duration">
<xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
<xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
<xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
</xs:restriction>
</xs:simpleType>
<xs:element name="guid" nillable="true" type="tns:guid" />
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
</xs:restriction>
</xs:simpleType>
<xs:attribute name="FactoryType" type="xs:QName" />
<xs:attribute name="Id" type="xs:ID" />
<xs:attribute name="Ref" type="xs:IDREF" />
</xs:schema>
Ниже представлено содержимое ArrayOfString.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
elementFormDefault="qualified"
targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ArrayOfstring">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="string"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfstring" nillable="true" type="tns:ArrayOfstring" />
</xs:schema>
Ниже представлено содержимое HostService-20100825.wsdl:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions name="HostService-20100825"
targetNamespace="http://dicom.nema.org/PS3.19/HostService-20100825"
xmlns:tns="http://dicom.nema.org/PS3.19/HostService-20100825"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xsd:schema targetNamespace="http://dicom.nema.org/PS3.19/Imports/HostService-20100825">
<xsd:import namespace="http://dicom.nema.org/PS3.19/HostService-20100825"
schemaLocation="./HostService-20100825.xsd" />
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/"
schemaLocation="./Types.xsd" />
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
schemaLocation="./ArrayOfString.xsd" />
<xsd:import namespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
schemaLocation="./XPathNodeType.xsd" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="IHostService_GenerateUID_InputMessage">
<wsdl:part name="parameters" element="tns:GenerateUID" />
</wsdl:message>
<wsdl:message name="IHostService_GenerateUID_OutputMessage">
<wsdl:part name="parameters" element="tns:GenerateUIDResponse" />
</wsdl:message>
<wsdl:message name="IHostService_GetAvailableScreen_InputMessage">
<wsdl:part name="parameters" element="tns:GetAvailableScreen" />
</wsdl:message>
<wsdl:message name="IHostService_GetAvailableScreen_OutputMessage">
<wsdl:part name="parameters" element="tns:GetAvailableScreenResponse" />
</wsdl:message>
<wsdl:message name="IHostService_GetOutputLocation_InputMessage">
<wsdl:part name="parameters" element="tns:GetOutputLocation" />
</wsdl:message>
<wsdl:message name="IHostService_GetOutputLocation_OutputMessage">
<wsdl:part name="parameters" element="tns:GetOutputLocationResponse" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyStateChanged_InputMessage">
<wsdl:part name="parameters" element="tns:NotifyStateChanged" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyStateChanged_OutputMessage">
<wsdl:part name="parameters" element="tns:NotifyStateChangedResponse" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyStatus_InputMessage">
<wsdl:part name="parameters" element="tns:NotifyStatus" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyStatus_OutputMessage">
<wsdl:part name="parameters" element="tns:NotifyStatusResponse" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyDataAvailable_InputMessage">
<wsdl:part name="parameters" element="tns:NotifyDataAvailable" />
</wsdl:message>
<wsdl:message name="IHostService_NotifyDataAvailable_OutputMessage">
<wsdl:part name="parameters" element="tns:NotifyDataAvailableResponse" />
</wsdl:message>
<wsdl:message name="IHostService_GetData_InputMessage">
<wsdl:part name="parameters" element="tns:GetData" />
</wsdl:message>
<wsdl:message name="IHostService_GetData_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataResponse" />
</wsdl:message>
<wsdl:message name="IHostService_ReleaseData_InputMessage">
<wsdl:part name="parameters" element="tns:ReleaseData" />
</wsdl:message>
<wsdl:message name="IHostService_ReleaseData_OutputMessage">
<wsdl:part name="parameters" element="tns:ReleaseDataResponse" />
</wsdl:message>
<wsdl:message name="IHostService_GetAsModels_InputMessage">
<wsdl:part name="parameters" element="tns:GetAsModels" />
</wsdl:message>
<wsdl:message name="IHostService_GetAsModels_OutputMessage">
<wsdl:part name="parameters" element="tns:GetAsModelsResponse" />
</wsdl:message>
<wsdl:message name="IHostService_ReleaseModels_InputMessage">
<wsdl:part name="parameters" element="tns:ReleaseModels" />
</wsdl:message>
<wsdl:message name="IHostService_ReleaseModels_OutputMessage">
<wsdl:part name="parameters" element="tns:ReleaseModelsResponse" />
</wsdl:message>
<wsdl:message name="IHostService_QueryModel_InputMessage">
<wsdl:part name="parameters" element="tns:QueryModel" />
</wsdl:message>
<wsdl:message name="IHostService_QueryModel_OutputMessage">
<wsdl:part name="parameters" element="tns:QueryModelResponse" />
</wsdl:message>
<wsdl:message name="IHostService_QueryInfoSet_InputMessage">
<wsdl:part name="parameters" element="tns:QueryInfoSet" />
</wsdl:message>
<wsdl:message name="IHostService_QueryInfoSet_OutputMessage">
<wsdl:part name="parameters" element="tns:QueryInfoSetResponse" />
</wsdl:message>
<wsdl:portType name="IHostService-20100825">
<wsdl:operation name="GenerateUID">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GenerateUID"
message="tns:IHostService_GenerateUID_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GenerateUIDResponse"
message="tns:IHostService_GenerateUID_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetAvailableScreen">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetAvailableScreen"
message="tns:IHostService_GetAvailableScreen_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetAvailableScreenResponse"
message="tns:IHostService_GetAvailableScreen_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetOutputLocation">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetOutputLocation"
message="tns:IHostService_GetOutputLocation_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetOutputLocationResponse"
message="tns:IHostService_GetOutputLocation_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="NotifyStateChanged">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyStateChanged"
message="tns:IHostService_NotifyStateChanged_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyStateChangedResponse"
message="tns:IHostService_NotifyStateChanged_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="NotifyStatus">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyStatus"
message="tns:IHostService_NotifyStatus_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyStatusResponse"
message="tns:IHostService_NotifyStatus_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="NotifyDataAvailable">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyDataAvailable"
message="tns:IHostService_NotifyDataAvailable_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/NotifyDataAvailableResponse"
message="tns:IHostService_NotifyDataAvailable_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetData">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetData"
message="tns:IHostService_GetData_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetDataResponse"
message="tns:IHostService_GetData_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="ReleaseData">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/ReleaseData"
message="tns:IHostService_ReleaseData_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/ReleaseDataResponse"
message="tns:IHostService_ReleaseData_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="GetAsModels">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetAsModels"
message="tns:IHostService_GetAsModels_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/GetAsModelsResponse"
message="tns:IHostService_GetAsModels_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="ReleaseModels">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/ReleaseModels"
message="tns:IHostService_ReleaseModels_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/ReleaseModelsResponse"
message="tns:IHostService_ReleaseModels_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="QueryModel">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/QueryModel"
message="tns:IHostService_QueryModel_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/QueryModelResponse"
message="tns:IHostService_QueryModel_OutputMessage" />
</wsdl:operation>
<wsdl:operation name="QueryInfoSet">
<wsdl:input wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/QueryInfoSet"
message="tns:IHostService_QueryInfoSet_InputMessage" />
<wsdl:output
wsaw:Action="http://dicom.nema.org/PS3.19/IHostService/QueryInfoSetResponse"
message="tns:IHostService_QueryInfoSet_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HostService-YYYYNNDDBinding"
type="tns:IHostService-20100825">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GenerateUID">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/GenerateUID"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAvailableScreen">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/GetAvailableScreen"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetOutputLocation">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/GetOutputLocation"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="NotifyStateChanged">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/NotifyStateChanged"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="NotifyStatus">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/NotifyStatus"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="NotifyDataAvailable">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/NotifyDataAvailable"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetData">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/GetData"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ReleaseData">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/ReleaseData"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAsModels">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/GetAsModels"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ReleaseModels">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/ReleaseModels"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="QueryModel">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/QueryModel"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="QueryInfoSet">
<soap:operation
soapAction="http://dicom.nema.org/PS3.19/IHostService/QueryInfoSet"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HostService-20100825">
<wsdl:port name="HostServiceBinding"
binding="tns:HostService-YYYYNNDDBinding">
<soap:address location="http://localhost/Service" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Ниже представлено содержимое HostService-20100825.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://dicom.nema.org/PS3.19/HostService-20100825"
elementFormDefault="qualified"
targetNamespace="http://dicom.nema.org/PS3.19/HostService-20100825"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
<xs:import namespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath" />
<xs:element name="GenerateUID">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="GenerateUIDResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GenerateUIDResult" nillable="true"
type="tns:UID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="UID">
<xs:sequence>
<xs:element minOccurs="0" name="Uid" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="UID" nillable="true" type="tns:UID" />
<xs:element name="GetAvailableScreen">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="preferredScreen" nillable="true"
type="tns:Rectangle" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Rectangle">
<xs:sequence>
<xs:element minOccurs="0" name="Height" type="xs:int" />
<xs:element minOccurs="0" name="Width" type="xs:int" />
<xs:element minOccurs="0" name="RefPointX" type="xs:int" />
<xs:element minOccurs="0" name="RefPointY" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:element name="Rectangle" nillable="true" type="tns:Rectangle" />
<xs:element name="GetAvailableScreenResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetAvailableScreenResult"
nillable="true" type="tns:Rectangle" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetOutputLocation">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="preferredProtocols" nillable="true"
xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
type="q1:ArrayOfstring" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetOutputLocationResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetOutputLocationResult"
nillable="true" type="xs:anyURI" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="NotifyStateChanged">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="state" type="tns:State" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="State">
<xs:restriction base="xs:string">
<xs:enumeration value="IDLE" />
<xs:enumeration value="INPROGRESS" />
<xs:enumeration value="SUSPENDED" />
<xs:enumeration value="COMPLETED" />
<xs:enumeration value="CANCELED" />
<xs:enumeration value="EXIT" />
</xs:restriction>
</xs:simpleType>
<xs:element name="State" nillable="true" type="tns:State" />
<xs:element name="NotifyStateChangedResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="NotifyStatus">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="status" nillable="true"
type="tns:Status" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Status">
<xs:sequence>
<xs:element minOccurs="0" name="StatusType" type="tns:StatusType" />
<xs:element minOccurs="0" name="CodeValue" type="xs:int" />
<xs:element minOccurs="0" name="CodingSchemeDesignator" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="CodeMeaning" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="ContextIdentifier" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="MappingResource" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="ContextGroupVersion" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="ContextGroupExtensionFlag"
nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="ContextGroupLocalVersion" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="ContextGroupExtensionCreatorUID"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="Status" nillable="true" type="tns:Status" />
<xs:simpleType name="StatusType">
<xs:restriction base="xs:string">
<xs:enumeration value="INFORMATION" />
<xs:enumeration value="WARNING" />
<xs:enumeration value="ERROR" />
<xs:enumeration value="FATALERROR" />
</xs:restriction>
</xs:simpleType>
<xs:element name="StatusType" nillable="true" type="tns:StatusType" />
<xs:element name="NotifyStatusResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="NotifyDataAvailable">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="data" nillable="true"
type="tns:AvailableData" />
<xs:element minOccurs="0" name="lastData" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="AvailableData">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Patients" nillable="true"
type="tns:ArrayOfPatient" />
</xs:sequence>
</xs:complexType>
<xs:element name="AvailableData" nillable="true" type="tns:AvailableData" />
<xs:complexType name="ArrayOfObjectDescriptor">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="ObjectDescriptor"
nillable="true" type="tns:ObjectDescriptor" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfObjectDescriptor" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:complexType name="ObjectDescriptor">
<xs:sequence>
<xs:element minOccurs="0" name="ClassUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="MimeType" nillable="true"
type="tns:MimeType" />
<xs:element minOccurs="0" name="Modality" nillable="true"
type="tns:Modality" />
<xs:element minOccurs="0" name="TransferSyntaxUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="DescriptorUuid" nillable="true"
type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectDescriptor" nillable="true"
type="tns:ObjectDescriptor" />
<xs:complexType name="MimeType">
<xs:sequence>
<xs:element minOccurs="0" name="Type" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="MimeType" nillable="true" type="tns:MimeType" />
<xs:complexType name="Modality">
<xs:sequence>
<xs:element minOccurs="0" name="Modality" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="Modality" nillable="true" type="tns:Modality" />
<xs:complexType name="UUID">
<xs:sequence>
<xs:element minOccurs="0" name="Uuid" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="UUID" nillable="true" type="tns:UUID" />
<xs:complexType name="ArrayOfPatient">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Patient"
nillable="true" type="tns:Patient" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfPatient" nillable="true"
type="tns:ArrayOfPatient" />
<xs:complexType name="Patient">
<xs:sequence>
<xs:element minOccurs="0" name="AssigningAuthority" nillable="true"
type="xs:string" />
<xs:element minOccurs="0" name="DateOfBirth" type="xs:dateTime" />
<xs:element minOccurs="0" name="ID" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Sex" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Studies" nillable="true"
type="tns:ArrayOfStudy" />
</xs:sequence>
</xs:complexType>
<xs:element name="Patient" nillable="true" type="tns:Patient" />
<xs:complexType name="ArrayOfStudy">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Study"
nillable="true" type="tns:Study" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfStudy" nillable="true" type="tns:ArrayOfStudy" />
<xs:complexType name="Study">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="Series" nillable="true"
type="tns:ArrayOfSeries" />
<xs:element minOccurs="0" name="StudyUID" nillable="true"
type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="Study" nillable="true" type="tns:Study" />
<xs:complexType name="ArrayOfSeries">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Series"
nillable="true" type="tns:Series" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfSeries" nillable="true" type="tns:ArrayOfSeries" />
<xs:complexType name="Series">
<xs:sequence>
<xs:element minOccurs="0" name="ObjectDescriptors" nillable="true"
type="tns:ArrayOfObjectDescriptor" />
<xs:element minOccurs="0" name="SeriesUID" nillable="true"
type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="Series" nillable="true" type="tns:Series" />
<xs:element name="NotifyDataAvailableResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="NotifyDataAvailableResult"
type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="acceptableTransferSyntaxes"
nillable="true" type="tns:ArrayOfUID" />
<xs:element minOccurs="0" name="includeBulkData" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfUUID">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="UUID"
nillable="true" type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfUUID" nillable="true" type="tns:ArrayOfUUID" />
<xs:complexType name="ArrayOfUID">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="UID"
nillable="true" type="tns:UID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfUID" nillable="true" type="tns:ArrayOfUID" />
<xs:element name="GetDataResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetDataResult" nillable="true"
type="tns:ArrayOfObjectLocator" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfObjectLocator">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="ObjectLocator"
nillable="true" type="tns:ObjectLocator" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfObjectLocator" nillable="true"
type="tns:ArrayOfObjectLocator" />
<xs:complexType name="ObjectLocator">
<xs:sequence>
<xs:element minOccurs="0" name="Length" type="xs:long" />
<xs:element minOccurs="0" name="Offset" type="xs:long" />
<xs:element minOccurs="0" name="TransferSyntax" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="URI" nillable="true" type="xs:anyURI" />
<xs:element minOccurs="0" name="Locator" nillable="true"
type="tns:UUID" />
<xs:element minOccurs="0" name="Source" nillable="true"
type="tns:UUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectLocator" nillable="true" type="tns:ObjectLocator" />
<xs:element name="ReleaseData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReleaseDataResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="GetAsModels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="objects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="classUID" nillable="true"
type="tns:UID" />
<xs:element minOccurs="0" name="supportedInfoSetTypes" nillable="true"
type="tns:ArrayOfMimeType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfMimeType">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="MimeType"
nillable="true" type="tns:MimeType" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfMimeType" nillable="true"
type="tns:ArrayOfMimeType" />
<xs:element name="GetAsModelsResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetAsModelsResult" nillable="true"
type="tns:ModelSetDescriptor" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ModelSetDescriptor">
<xs:sequence>
<xs:element minOccurs="0" name="FailedSourceObjects" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="InfosetType" nillable="true"
type="tns:MimeType" />
<xs:element minOccurs="0" name="Models" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
<xs:element name="ModelSetDescriptor" nillable="true"
type="tns:ModelSetDescriptor" />
<xs:element name="ReleaseModels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReleaseModelsResponse">
<xs:complexType>
<xs:sequence />
</xs:complexType>
</xs:element>
<xs:element name="QueryModel">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="xPaths" nillable="true"
xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
type="q2:ArrayOfstring" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="QueryModelResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="QueryModelResult" nillable="true"
type="tns:ArrayOfQueryResult" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfQueryResult">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="QueryResult"
nillable="true" type="tns:QueryResult" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfQueryResult" nillable="true"
type="tns:ArrayOfQueryResult" />
<xs:complexType name="QueryResult">
<xs:sequence>
<xs:element minOccurs="0" name="Model" nillable="true" type="tns:UUID" />
<xs:element minOccurs="0" name="Result" nillable="true"
type="tns:ArrayOfXPathNode" />
<xs:element minOccurs="0" name="XPath" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="QueryResult" nillable="true" type="tns:QueryResult" />
<xs:complexType name="ArrayOfXPathNode">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="XPathNode"
nillable="true" type="tns:XPathNode" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfXPathNode" nillable="true"
type="tns:ArrayOfXPathNode" />
<xs:complexType name="XPathNode">
<xs:sequence>
<xs:element minOccurs="0" name="NodeType"
xmlns:q3="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
type="q3:XPathNodeType" />
<xs:element minOccurs="0" name="Value" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="XPathNode" nillable="true" type="tns:XPathNode" />
<xs:element name="QueryInfoSet">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="models" nillable="true"
type="tns:ArrayOfUUID" />
<xs:element minOccurs="0" name="xPaths" nillable="true"
xmlns:q4="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
type="q4:ArrayOfstring" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="QueryInfoSetResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="QueryInfoSetResult" nillable="true"
type="tns:ArrayOfQueryResultInfoSet" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ArrayOfQueryResultInfoSet">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="QueryResultInfoSet"
nillable="true" type="tns:QueryResultInfoSet" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfQueryResultInfoSet" nillable="true"
type="tns:ArrayOfQueryResultInfoSet" />
<xs:complexType name="QueryResultInfoSet">
<xs:sequence>
<xs:element minOccurs="0" name="Model" nillable="true" type="tns:UUID" />
<xs:element minOccurs="0" name="Result" nillable="true"
type="tns:ArrayOfXPathNodeInfoSet" />
<xs:element minOccurs="0" name="XPath" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="QueryResultInfoSet" nillable="true"
type="tns:QueryResultInfoSet" />
<xs:complexType name="ArrayOfXPathNodeInfoSet">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="XPathNodeInfoSet"
nillable="true" type="tns:XPathNodeInfoSet" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfXPathNodeInfoSet" nillable="true"
type="tns:ArrayOfXPathNodeInfoSet" />
<xs:complexType name="XPathNodeInfoSet">
<xs:sequence>
<xs:element minOccurs="0" name="InfoSetValue" nillable="true"
type="xs:base64Binary" />
<xs:element minOccurs="0" name="NodeType"
xmlns:q5="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
type="q5:XPathNodeType" />
</xs:sequence>
</xs:complexType>
<xs:element name="XPathNodeInfoSet" nillable="true"
type="tns:XPathNodeInfoSet" />
</xs:schema>
Ниже представлено содержимое XPathNodeType.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
elementFormDefault="qualified"
targetNamespace="http://schemas.datacontract.org/2004/07/System.Xml.XPath"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="XPathNodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Root" />
<xs:enumeration value="Element" />
<xs:enumeration value="Attribute" />
<xs:enumeration value="Namespace" />
<xs:enumeration value="Text" />
<xs:enumeration value="SignificantWhitespace" />
<xs:enumeration value="Whitespace" />
<xs:enumeration value="ProcessingInstruction" />
<xs:enumeration value="Comment" />
<xs:enumeration value="All" />
</xs:restriction>
</xs:simpleType>
<xs:element name="XPathNodeType" nillable="true" type="tns:XPathNodeType" />
</xs:schema>
Ниже представлено содержимое Types.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="anyType" nillable="true" type="xs:anyType" />
<xs:element name="anyURI" nillable="true" type="xs:anyURI" />
<xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
<xs:element name="boolean" nillable="true" type="xs:boolean" />
<xs:element name="byte" nillable="true" type="xs:byte" />
<xs:element name="dateTime" nillable="true" type="xs:dateTime" />
<xs:element name="decimal" nillable="true" type="xs:decimal" />
<xs:element name="double" nillable="true" type="xs:double" />
<xs:element name="float" nillable="true" type="xs:float" />
<xs:element name="int" nillable="true" type="xs:int" />
<xs:element name="long" nillable="true" type="xs:long" />
<xs:element name="QName" nillable="true" type="xs:QName" />
<xs:element name="short" nillable="true" type="xs:short" />
<xs:element name="string" nillable="true" type="xs:string" />
<xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
<xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
<xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
<xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
<xs:element name="char" nillable="true" type="tns:char" />
<xs:simpleType name="char">
<xs:restriction base="xs:int" />
</xs:simpleType>
<xs:element name="duration" nillable="true" type="tns:duration" />
<xs:simpleType name="duration">
<xs:restriction base="xs:duration">
<xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
<xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
<xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
</xs:restriction>
</xs:simpleType>
<xs:element name="guid" nillable="true" type="tns:guid" />
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
</xs:restriction>
</xs:simpleType>
<xs:attribute name="FactoryType" type="xs:QName" />
<xs:attribute name="Id" type="xs:ID" />
<xs:attribute name="Ref" type="xs:IDREF" />
</xs:schema>
Ниже представлено содержимое ArrayOfString.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
elementFormDefault="qualified"
targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ArrayOfstring">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="string"
nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfstring" nillable="true" type="tns:ArrayOfstring" />
</xs:schema>