Come utilizzare doxygen per creare diagrammi classi UML da sorgenti C ++


90

Ho cercato del materiale che descriva come generare semplici diagrammi di classe con doxygen, ma non sono riuscito a trovarne uno. Qualcuno può aiutare?

Ho bisogno di creare diagrammi come mostrato di seguito da un set di file C ++. testo alternativo

Se sono disponibili strumenti migliori per ottenere questo risultato più facilmente, fammelo sapere.


hai ottenuto diagrammi come questo, incluse informazioni su attributi e tipi di metodo?
Adrian

Risposte:


50

Doxygen crea diagrammi di ereditarietà ma non credo che creerà un'intera gerarchia di classi. Ti consente di utilizzare lo strumento GraphViz. Se utilizzi lo strumento frontend della GUI di Doxygen troverai le opzioni pertinenti in Step2: -> Wizard tab -> Diagrams. Le opzioni di relazione DOT si trovano nella scheda Esperto.


6
Sarai in grado di navigare nell'intera gerarchia, i limiti sono su ciò che viene visualizzato su un diagramma. Ci sono un paio di parametri che limitano l'ambito del grafico. DOT_GRAPH_NODES limita il numero di voci su una singola pagina e MAX_DOT_GRAPH_DEPTH limita il livello di profondità. L'impostazione di questi valori su valori elevati rende molto dispendioso in termini di tempo per un progetto di grandi dimensioni.
DanS

Grazie. Ha funzionato per me. Ho anche ignorato alcune opzioni in Expert-> Dot
tsenapathy

46

Citazione da questo post (è scritto dallo stesso autore di 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

11
Questo non genererà un diagramma di classe completo (ad esempio, la relazione molti a uno tra la classe A e la classe B); solo un diagramma di ereditarietà, cioè che mostra le relazioni tra superclasse / sottoclasse.
matrigna

39

Hmm, questa sembra essere una vecchia domanda, ma dal momento che ho avuto a che fare con la configurazione di Doxygen negli ultimi giorni, mentre la mia testa è ancora piena di informazioni attuali, proviamoci -

Penso che le risposte precedenti ce l'abbiano quasi:

L'opzione mancante è aggiungere COLLABORATION_GRAPH = YESnel Doxyfile. Presumo che tu possa fare la cosa equivalente da qualche parte nella GUI di doxywizard (non uso doxywizard).

Quindi, come esempio più completo, le tipiche opzioni "Doxyfile" relative all'output UML che tendo a usare sono:

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

Queste impostazioni genereranno diagrammi di "ereditarietà" ( CLASS_GRAPH=YES) e "collaborazione" ( COLLABORATION_GRAPH=YES).

A seconda del target per la "distribuzione" dell'output di doxygen, anche l'impostazione DOT_IMAGE_FORMAT = svgpuò essere utile. Con l'output svg i diagrammi sono "scalabili" invece della risoluzione fissa dei formati bitmap come .png. Apparentemente, se si visualizza l'output in browser diversi da IE, c'è anche INTERACTIVE_SVG = YESche consentirà "zoom e panning interattivi" dei diagrammi svg generati. L'ho provato qualche tempo fa e l'output svg era visivamente molto attraente, ma all'epoca il supporto del browser per svg era ancora un po 'incoerente, quindi spero che la situazione possa essere migliorata ultimamente.

Come altri commenti hanno menzionato, alcune di queste impostazioni ( DOT_GRAPH_MAX_NODESin particolare) hanno un potenziale impatto sulle prestazioni, quindi YMMV.

Tendo a odiare le risposte in stile "RTFM", quindi mi scuso per questa frase, ma in questo caso la documentazione di Doxygen è davvero tua amica, quindi controlla i documenti Doxygen sulle impostazioni sopra menzionate - l'ultima volta che ho guardato puoi trovare i dettagli su http://www.doxygen.nl/manual/config.html .


Buona risposta. Nella tua risposta hai scritto "CLASS _DIAGRAMS" invece di "CLASS_GRAPH".
DavidS

Hmm, in realtà, ora che ne parli, vedo che ho sia CLASS_DIAGRAMS = YES che CLASS_GRAPH = YES. Dopo aver controllato i documenti per Doxygen 1.8.9.1 ho scoperto che in realtà CLASS_GRAPH = YES sovrascriverà CLASS_DIAGRAMS = YES in modo che le due opzioni interagiscano, con CLASS_GRAPH = YES che ha la precedenza. Quindi, in realtà, per gli scopi della domanda originale quello che ho funzionerà, comunque buona presa!
user6092647

puoi anche modificare OUTPUT_DIRECTORY e consentire la ricerca RICURSIVA
Il giullare del re

Potrebbe anche essere necessario modificare il campo RECURSIVEin YES
prehistoricpenguin

6

Enterprise Architect creerà un diagramma UML dal codice sorgente importato.


Votato anche per aver risposto alla domanda "Se ci sono strumenti migliori per ottenere questo risultato più facilmente, fammelo sapere".
kaveish

5

Penso che dovrai modificare il file doxys e impostare GENERATE_UML (qualcosa del genere) su true. E devi avere dot / graphviz installato.


12
Stai parlando dell'opzione UML_LOOK?
David Doria

@DavidDoria deve essere. Ma UML_LOOK non mostrerà alcun tipo di dati.
Ruud Verhoef

2

Le 2 risposte con il voto più alto sono corrette. Ad oggi, l'unica cosa che dovevo modificare (dalle impostazioni predefinite) era abilitare la generazione utilizzando il punto anziché il generatore integrato.

Alcune note importanti:

  • Doxygen non genererà un diagramma completo effettivo di tutte le classi nel progetto . Genererà un'immagine separata per ogni gerarchia. Se hai più gerarchie di classi non correlate, otterrai più immagini.
  • Tutti questi diagrammi possono essere trovati in html/inherits.htmlo (dalla navigazione del sito web) classes => class hierarchy => "Vai alla gerarchia delle classi testuale".
  • Questa è una domanda in C ++, quindi parliamo di modelli. Soprattutto se erediti da T.
    • Ogni istanza di modello sarà correttamente considerata un tipo diverso da Doxygen. I tipi che ereditano da istanze diverse avranno classi padre diverse nel diagramma.
    • Se un modello di classe fooeredita da Te il Tparametro del tipo di modello ha un valore predefinito, verrà assunto tale valore predefinito. Se c'è un tipo barche eredita da foo<U>dove Uè diverso da quello predefinito, baravrà un foo<U>genitore. foo<>e bar<U>non avrà un genitore comune.
    • Se ci sono più modelli di classe che ereditano da almeno uno dei loro parametri di modello, Doxygen assumerà un genitore comune per questi modelli di classe purché i parametri del tipo di modello abbiano esattamente gli stessi nomi nel codice. Ciò incentiva la coerenza nella denominazione.
    • CRTP e CRTP inverso funzionano semplicemente.
    • Gli alberi di ereditarietà dei modelli ricorsivi non vengono espansi. variantVerrà visualizzata qualsiasi istanza da cui ereditare variant<Ts...>.
    • Vengono disegnati modelli di classe senza istanze. Avranno una <...>stringa nel loro nome che rappresenta i parametri di tipo e non di tipo che non avevano valori predefiniti.
    • Sono in fase di elaborazione anche specializzazioni parziali e complete dei modelli di classe. Doxygen genera grafici corretti se le specializzazioni ereditano da tipi diversi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.