Cómo usar Doxygen para crear diagramas de clases UML desde la fuente C ++

90

He estado buscando material que describa cómo generar diagramas de clases simples con doxygen, pero no pude encontrar uno. ¿Alguien puede ayudar?

Necesito crear diagramas como se muestra a continuación a partir de un conjunto de archivos C ++. texto alternativo

Si hay mejores herramientas para lograr esto más fácilmente, hágamelo saber.

devnull
fuente
¿Consiguió diagramas como este que incluyan información sobre los tipos de métodos y atributos?
IzZy

Respuestas:

50

Doxygen crea diagramas de herencia pero no creo que creará una jerarquía de clases completa. Le permite utilizar la herramienta GraphViz. Si utiliza la herramienta de interfaz gráfica de usuario de Doxygen, encontrará las opciones relevantes en Step2: -> Wizard tab -> Diagrams. Las opciones de relación DOT se encuentran en la pestaña Experto.

DPD
fuente
6
Podrá navegar por toda la jerarquía, los límites están en lo que se muestra en un diagrama. Hay un par de parámetros que limitan el alcance del gráfico. DOT_GRAPH_NODES limita la cantidad de entradas en una sola página y MAX_DOT_GRAPH_DEPTH restringe la profundidad. Establecerlos en valores altos hace que sea muy lento para un proyecto grande.
DanS
Gracias. Funcionó para mí. También he anulado algunas opciones en Experto-> Punto
tsenapathy
46

Cita de esta publicación (está escrita por el propio autor de doxygen):

run doxygen -g and change the following options of the generated Doxyfile:

    EXTRACT_ALL            = YES
    HAVE_DOT               = YES
    UML_LOOK               = YES

run doxygen again
promedio
fuente
11
Esto no generará un diagrama de clases completo (por ejemplo, la relación de muchos a uno entre la clase A y la clase B); sólo un diagrama de herencia, es decir, que muestra las relaciones superclase / subclase.
stepthom
39

Hmm, esta parece ser una pregunta un poco vieja, pero como he estado jugando con la configuración de Doxygen los últimos días, mientras mi cabeza todavía está llena de información actual, intentemos hacerlo.

Creo que las respuestas anteriores casi lo tienen:

La opción que falta es agregar COLLABORATION_GRAPH = YESel Doxyfile. Supongo que puede hacer lo equivalente en algún lugar de la GUI de doxywizard (yo no uso doxywizard).

Entonces, como un ejemplo más completo, las opciones típicas de "Doxyfile" relacionadas con la salida UML que suelo usar son:

EXTRACT_ALL          = YES
CLASS_DIAGRAMS      = YES
HIDE_UNDOC_RELATIONS = NO
HAVE_DOT             = YES
CLASS_GRAPH          = YES
COLLABORATION_GRAPH  = YES
UML_LOOK             = YES
UML_LIMIT_NUM_FIELDS = 50
TEMPLATE_RELATIONS   = YES
DOT_GRAPH_MAX_NODES  = 100
MAX_DOT_GRAPH_DEPTH  = 0
DOT_TRANSPARENT      = YES

Esta configuración generará diagramas de "herencia" ( CLASS_GRAPH=YES) y "colaboración" ( COLLABORATION_GRAPH=YES).

Dependiendo de su objetivo para el "despliegue" de la salida de oxígeno, la configuración DOT_IMAGE_FORMAT = svgtambién puede ser útil. Con la salida svg, los diagramas son "escalables" en lugar de la resolución fija de los formatos de mapa de bits como .png. Aparentemente, si se visualiza la salida en otros navegadores que no sean IE, también existe INTERACTIVE_SVG = YESlo que permitirá "hacer zoom y paneo interactivo" de los diagramas svg generados. Probé esto hace algún tiempo, y la salida de svg era muy atractiva visualmente, pero en ese momento, el soporte del navegador para svg todavía era un poco inconsistente, así que espero que la situación haya mejorado últimamente.

Como han mencionado otros comentarios, algunas de estas configuraciones ( DOT_GRAPH_MAX_NODESen particular) tienen impactos potenciales en el rendimiento, por lo que YMMV.

Tiendo a odiar las respuestas de estilo "RTFM", así que disculpas por esta oración, pero en este caso la documentación de Doxygen realmente es tu amiga, así que revisa los documentos de Doxygen en las configuraciones mencionadas anteriormente. La última vez que miré, puedes encontrar los detalles en http://www.doxygen.nl/manual/config.html .

user6092647
fuente
Buena respuesta. En su respuesta, escribió "CLASS_DIAGRAMS" en lugar de "CLASS_GRAPH".
DavidS
Hmm, en realidad, ahora lo mencionas, veo que tengo CLASS_DIAGRAMS = YES y CLASS_GRAPH = YES. Después de verificar los documentos de Doxygen 1.8.9.1, descubrí que en realidad CLASS_GRAPH = YES anulará CLASS_DIAGRAMS = YES para que las dos opciones interactúen, con CLASS_GRAPH = YES teniendo prioridad. Entonces, en realidad, para los propósitos de la pregunta original, lo que tengo funcionará, ¡sin embargo, buena captura!
user6092647
también puede cambiar el OUTPUT_DIRECTORY y permitir la búsqueda RECURSIVA
bufón del rey
También es posible que deba cambiar el RECURSIVEarchivo a YES
prehistoricpenguin
6

Enterprise Architect construirá un diagrama UML a partir del código fuente importado.

zooropa
fuente
Votó a favor por responder también a la pregunta "Si hay mejores herramientas para lograr esto más fácilmente, hágamelo saber".
kaveish
5

Creo que necesitará editar el archivo doxys y establecer GENERATE_UML (algo así) en verdadero. Y necesita tener dot / graphviz instalado.

Fzhou
fuente
12
¿Estás hablando de la opción UML_LOOK?
David Doria
@DavidDoria debe serlo. Pero UML_LOOK no mostrará ningún tipo de datos.
Ruud Verhoef
2

Las 2 respuestas con mayor voto positivo son correctas. A partir de hoy, lo único que necesitaba cambiar (desde la configuración predeterminada) era habilitar la generación usando dot en lugar del generador incorporado.

Algunas notas importantes:

  • Doxygen no generará un diagrama completo real de todas las clases del proyecto . Generará una imagen separada para cada jerarquía. Si tiene varias jerarquías de clases no relacionadas, obtendrá varias imágenes.
  • Todos estos diagramas se pueden encontrar en html/inherits.htmlo (desde la navegación del sitio web) clases => jerarquía de clases => "Ir a la jerarquía de clases textuales".
  • Esta es una pregunta de C ++, así que hablemos de plantillas. Especialmente si hereda de T.
    • Cada instanciación de plantilla será considerada correctamente por Doxygen como un tipo diferente. Los tipos que heredan de diferentes instancias tendrán diferentes clases padre en el diagrama.
    • Si una plantilla de clase foohereda Ty el Tparámetro de tipo de plantilla tiene un valor predeterminado, se asumirá dicho valor predeterminado. Si hay un tipo barque hereda de foo<U>where Ues diferente al predeterminado, bartendrá un foo<U>padre. foo<>y bar<U>no tendrá un padre común.
    • Si hay varias plantillas de clase que heredan de al menos uno de sus parámetros de plantilla, Doxygen asumirá un padre común para estas plantillas de clase siempre que los parámetros de tipo de plantilla tengan exactamente los mismos nombres en el código. Esto incentiva la coherencia en la denominación.
    • CRTP y CRTP inverso simplemente funcionan.
    • Los árboles de herencia de plantilla recursiva no se expanden. Se variantmostrará cualquier instanciación para heredar variant<Ts...>.
    • Se están dibujando plantillas de clase sin instanciaciones. Tendrán una <...>cadena en su nombre que representa los parámetros de tipo y no tipo que no tenían valores predeterminados.
    • También se están dibujando plantillas de clases de especializaciones completas y parciales. Doxygen genera gráficos correctos si las especializaciones heredan de diferentes tipos.
Xeverous
fuente