Ideias para visualização de estrutura de dados de alto nível?

Ideias para visualização de estrutura de dados de alto nível?

Quero criar uma representação (gráfica) para um projeto personalizadoHL7 v2estrutura da mensagem. Neste cenário, estou preocupado apenas com a estrutura da mensagem de alto nível – a organização e o uso dos segmentos de uma mensagem. Os documentos oficiais (que não estão disponíveis a menos que você pague por eles, AFAIK) usam uma notação de tabela como esta:

estrutura de exemplo

Nesta estrutura, os diferentes colchetes denotam segmentos opcionais []e repetíveis , {}bem como alternativas <x|y|z>. Nossa estrutura personalizada é construída sobre esse padrão e basicamente anexa alguns segmentos e declara que nunca usaremos outros segmentos. Até agora, simplesmente imitamos a estrutura semelhante a uma tabela, mas acho que isso é difícil de ler, especialmente com vários níveis aninhados de grupos condicionais. Eu estava pensando em converter oExemplo de árvore de arquivos TikZpara representar a estrutura de dados, mas com todas as child [missing]entradas e outras peculiaridades, fiquei pensando se existem outras opções (melhores?).

Responder1

Concordo plenamente que o formato atual que você está usando é estranho e possivelmente esclarece os muitos motivos pelos quais os projetos de software de saúde falham; que IMHO é devido à complexificação burocrática. Ter que pagar pelos formatos acrescenta insulto à injúria.

Eu recomendaria usar Lua. Se você gerar os dados para composição tipográfica programaticamente, eu usaria tabelas Lua diretamente. Se eles forem gerados a partir de um banco de dados, exporte-os como XML ou de preferência json. Aqui está um programa simplificado para demonstrar isso. Não há necessidade de ferrovias ou caixas, você pode ler os dados como um parágrafo de um livro.

insira a descrição da imagem aqui

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

A rotina acima é muito simples, porém pode ser facilmente modificada para colorir melhor o código, classificar os campos e adicionar notas, etc. Como bônus, não há necessidade de nenhum catcode. Se você estiver interessado em uma solução JSON, deixe uma mensagem e eu postarei uma.

Responder2

Um exemplo: encontre em http://ddi.uni-wuppertal.de/material/materialsammlung/

o pacote está no CTAN:http://ctan.org/pkg/schule

Diagrama ferroviário - apresentado por Niklaus Wirth com linguagem de programação 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}

informação relacionada