¿Ideas para la visualización de estructuras de datos de alto nivel?

¿Ideas para la visualización de estructuras de datos de alto nivel?

Quiero crear una representación (gráfica) para una costumbreHL7v2estructura del mensaje. En este escenario, sólo me preocupa la estructura del mensaje de alto nivel: la disposición y el uso de los segmentos de un mensaje. Los documentos oficiales (que no están disponibles a menos que pague por ellos, AFAIK) usan una notación de tabla como esta:

estructura de ejemplo

En esta estructura, los diferentes corchetes denotan segmentos opcionales []y repetibles {}, así como alternativas <x|y|z>. Nuestra estructura personalizada se basa en este estándar y básicamente agrega algunos segmentos y declara que nunca usaremos otros segmentos específicos. Hasta ahora, simplemente hemos imitado la estructura similar a una tabla, pero encuentro que es difícil de leer, especialmente con múltiples niveles anidados de grupos condicionales. Estaba pensando en convertir elEjemplo de árbol de archivos TikZpara representar la estructura de datos, pero con todas las child [missing]entradas y otras peculiaridades, me preguntaba si hay otras opciones (¿mejores?).

Respuesta1

Estoy totalmente de acuerdo en que el formato actual que está utilizando es incómodo y posiblemente arroje luz sobre las muchas razones por las que fracasan los proyectos de software de salud; que en mi humilde opinión se debe a la complejidad burocrática. Tener que pagar por los formatos añade sal a la herida.

Recomendaría usar Lua. Si genera los datos para la composición tipográfica mediante programación, usaría tablas Lua directamente. Si se generan desde una base de datos, expórtelos como XML o preferiblemente como json. Aquí hay un programa simplificado para demostrar esto. No se necesitan ferrocarriles ni cajas, puede leer los datos como un párrafo de un libro.

ingrese la descripción de la imagen aquí

  \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}

La rutina anterior es muy simple, sin embargo, se puede modificar fácilmente para codificar mejor los colores, ordenar los campos y agregar notas, etc. Como beneficio adicional, no se necesitan códigos cat. Si está interesado en una solución json, envíe un mensaje y publicaré una.

Respuesta2

Un ejemplo: encuéntrelo en http://ddi.uni-wuppertal.de/material/materialsammlung/

El paquete está en CTAN:http://ctan.org/pkg/schule

Diagrama de ferrocarril: presentado por Niklaus Wirth con el lenguaje de programación 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}

información relacionada