Идеи для визуализации структуры данных высокого уровня?

Идеи для визуализации структуры данных высокого уровня?

Я хочу создать (графическое) представление для пользовательскогоHL7 v2Структура сообщения. В этом сценарии меня интересует только структура сообщения высокого уровня — расположение и использование сегментов сообщения. Официальные документы (которые, насколько мне известно, недоступны, если вы за них не платите) используют табличную запись, например:

пример структуры

В этой структуре различные скобки обозначают необязательные []и повторяющиеся {}сегменты, а также альтернативы <x|y|z>. Наша пользовательская структура построена на этом стандарте и в основном добавляет несколько сегментов и объявляет, что мы никогда не будем использовать некоторые другие сегменты. До сих пор мы просто имитировали табличную структуру, но я нахожу, что это трудно читать, особенно с несколькими уровнями вложенности условных групп. Я думал о преобразованииПример дерева файлов TikZдля представления структуры данных, но со всеми child [missing]записями и другими особенностями, я задался вопросом, есть ли другие (лучшие?) варианты.

решение1

Я полностью согласен, что текущий формат, который вы используете, неудобен и, возможно, он проливает свет на многие причины, по которым проекты программного обеспечения для здравоохранения терпят неудачу; что, по моему скромному мнению, связано с бюрократическим усложнением. Необходимость платить за форматы добавляет оскорбление к оскорблению.

Я бы рекомендовал использовать Lua. Если вы генерируете данные для набора программно, я бы использовал таблицы Lua напрямую. Если они генерируются из базы данных, экспортируйте их как XML или, что предпочтительнее, json. Вот упрощенная программа для демонстрации этого. Не нужны никакие железные дороги или коробки, вы можете читать данные как абзац из книги.

введите описание изображения здесь

  \documentclass{article}
    \usepackage{fontspec,luacode, xcolor}
    \newfontfamily{\arial}{Arial} 
    \begin{document}
    \arial

    \begin{luacode}
    if type(tex)=='table' then local print = tex.print  end

    local patientVisit = {
        patientClass = "CON",
        assignedPatientLocation = {
            pointOfCare = "8152879"
        },
        visitNumber = {
            idNumber = 16164813
        }
     }

    function inspect_table (tab, offset)
        offset = offset or "\\mbox{~~}"
        for k, v in pairs (tab) do
            local newoffset = offset .. offset
            if type(v) == "table" then
               print(offset..k .. " = \\{\\par ")
               inspect_table(v, newoffset)
               print(offset.."\\}\\par")
            else
             if k=="patientClass" then print(offset .. '{\\color{red}'.. k .. "} = " .. tostring(v), "\\par") 
               else
                  print(offset..k.."="..v.."\\par")
               end
           end
        end
    end

    inspect_table(patientVisit)
    \end{luacode}

Процедура выше очень проста, однако ее можно легко изменить, чтобы лучше раскрасить код, отсортировать поля и добавить заметки и т. д. В качестве бонуса не нужны никакие catcodes. Если вас интересует решение json, напишите сообщение, и я его опубликую.

решение2

Пример: найдите его по адресу http://ddi.uni-wuppertal.de/material/materialsammlung/

пакет находится на CTAN:http://ctan.org/pkg/schule

Схема железной дороги – представлена ​​Никлаусом Виртом с помощью языка программирования Pascal

\documentclass{schulein}
\usepackage[utf8]{inputenc}
\usepackage{schulinf}

\begin{document}

\begin{tikzpicture}[syntaxdiagramm]
\node [] {};
\node [terminal] {public};
\node [terminal] {class};
\node [nonterminal] {Klassenname};
\node [terminal] {\{};
\node (endstart) [point] {};
\node [point, below=of endstart] {};
\node [point, xshift=-75mm] {};
\node (endAttribute) [endpoint, continue chain=going below] {};
\node (startAttribute) [point] {};
{[start chain=attribute going right]
    \chainin (startAttribute);
    \node [point, xshift=25mm] {};
    \node [point, continue chain=going above] {};
    \node [nonterminal, continue chain=going left] {Attribut};
    \node [point, join,join=with endAttribute] {};
}

\node (startKonstruktor) [point] {};
\node (endKonstruktor) [endpoint] {};
{[start chain=konstruktor going right]
    \chainin (startKonstruktor);
    \node [point, xshift=30mm] {};
    \node [point, continue chain=going below] {};
    \node [nonterminal, continue chain=going left] {Konstruktor};
    \node [point, join,join=with endKonstruktor] {};
}

\node (endMethode) [endpoint] {};
\node (startMethode) [point] {};
{[start chain=methode going right]
    \chainin (startMethode);
    \node [point, xshift=25mm] {};
    \node [point, continue chain=going above] {};
    \node [nonterminal, continue chain=going left] {Methode};
    \node [point, join,join=with endMethode] {};
}

\node [point] {};
\node [terminal, continue chain=going left] {\}};

\end{tikzpicture}
\end{document}

Связанный контент