doxygenを使用してC ++ソースからUMLクラス図を作成する方法


90

doxygenを使用して簡単なクラス図を生成する方法を説明した資料を探していましたが、見つかりませんでした。誰か助けてもらえますか?

C ++ファイルのセットから、以下に示すような図を作成する必要があります。 代替テキスト

これを簡単に実現するためのより良いツールがある場合は、お知らせください。


属性やメソッドのタイプに関する情報を含めて、このような図を作成しましたか?
エイドリアン

回答:


50

Doxygenは継承図を作成しますが、クラス全体の階層を作成するとは思いません。GraphVizツールを使用できます。Doxygen GUIフロントエンドツールを使用する場合、関連するオプションがにありStep2: -> Wizard tab -> Diagramsます。DOT関係オプションは[エキスパート]タブにあります。


6
階層全体をナビゲートできます。制限は、ダイアグラムに表示されるものにあります。グラフのスコープを制限するパラメーターがいくつかあります。DOT_GRAPH_NODESは1ページのエントリ数を制限し、MAX_DOT_GRAPH_DEPTHはその深さを制限します。これらを大きな値に設定すると、大規模なプロジェクトでは非常に時間がかかります。
DanS、2011年

ありがとう。それは私のために働いた。Expert-> Dot
tsenapathy

46

この投稿からの引用(それは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
これは完全なクラス図(たとえば、クラスAとクラスB間の多対1の関係)を生成しません。継承図のみ、つまりスーパークラス/サブクラスの関係を示します。
stepthom 2015

39

うーん、これは少し古い質問のようですが、ここ数日、Doxygenの設定をいじっていたので、頭がまだ最新の情報でいっぱいになっているので、試してみましょう-

私は以前の答えにはほとんどそれがあると思います:

不足しているオプションはCOLLABORATION_GRAPH = YES、Doxyfile に追加することです。私は、doxywizard GUIのどこかで同等のことができると思います(私はdoxywizardを使用していません)。

したがって、より完全な例として、私が使用する傾向があるUML出力に関連する一般的な「Doxyfile」オプションは次のとおりです。

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

これらの設定により、「継承」(CLASS_GRAPH=YES)と「コラボレーション」(COLLABORATION_GRAPH=YES)の両方の図が生成されます。

doxygen出力の「デプロイメント」のターゲットによっては、設定DOT_IMAGE_FORMAT = svgも役立つ場合があります。svg出力では、図は.pngなどのビットマップ形式の固定解像度ではなく「スケーラブル」です。どうやら、IE以外のブラウザーで出力を表示する場合INTERACTIVE_SVG = YES、生成されたsvg図の「インタラクティブなズームとパン」を可能にするものもあります。私はこれを少し前に試しましたが、svgの出力は視覚的に非常に魅力的でしたが、当時のsvgに対するブラウザーのサポートにはまだ一貫性がなかったため、状況が最近改善された可能性があります。

他のコメントで述べたように、これらの設定の一部(DOT_GRAPH_MAX_NODES特に)はパフォーマンスに影響を与える可能性があるため、YMMVです。

私は「RTFM」スタイルの回答を嫌う傾向があるので、この文章については謝罪しますが、この場合、Doxygenのドキュメントは本当にあなたの友達です。ですから、上記の設定に関するDoxygenのドキュメントをチェックしてください。http://www.doxygen.nl/manual/config.html


いい答えだ。回答では、「CLASS_GRAPH」の場合は「CLASS _DIAGRAMS」と書きました。
DavidS

うーん、実際には、あなたはそれを表示します。私はCLASS_DIAGRAMS = YESとCLASS_GRAPH = YESの両方を持っているようです。Doxygen 1.8.9.1のドキュメントを確認した後、実際にはCLASS_GRAPH = YESがCLASS_DIAGRAMS = YESをオーバーライドするため、2つのオプションが相互作用し、CLASS_GRAPH = YESが優先されることがわかりました。したがって、実際には、元の質問の目的のために、私が何を機能するかはわかりますが、それでもうまくいきます!
user6092647

また、OUTPUT_DIRECTORYを変更して再帰検索を許可することもできます
King's jester

また、RECURSIVE提出をYES に変更する必要がある場合もあります
先史時代の

6

Enterprise ArchitectはインポートされたソースコードからUML図を構築します。


「これを簡単に実現するためのより良いツールがある場合は、私に知らせてください。」という質問にも回答して賛成です。
2016

5

doxysファイルを編集し、GENERATE_UML(そのようなもの)をtrueに設定する必要があると思います。そして、あなたはdot / graphvizをインストールする必要があります。


12
UML_LOOKオプションについて話していますか?
David Doria

@DavidDoriaはそうでなければなりません。ただし、UML_LOOKはデータ型を表示しません。
Ruud Verhoef

2

賛成票の上位2つが正解です。今日の時点で(デフォルト設定から)変更する必要があるのは、組み込みジェネレーターの代わりにドットを使用して生成できるようにすることだけでした

重要な注意事項:

  • Doxygenは、プロジェクトのすべてのクラスの実際の完全な図を生成しません。階層ごとに個別の画像が生成されます。複数の無関係なクラス階層がある場合は、複数の画像が取得されます。
  • これらの図はすべて、html/inherits.htmlクラス内または(Webサイトのナビゲーションから)クラス=>クラス階層=>「テキストのクラス階層に移動」で見つけることができます。
  • これはC ++の質問なので、テンプレートについて話しましょう。特にから継承する場合T
    • 各テンプレートのインスタンス化は、Doxygenによって正しく異なるタイプと見なされます。異なるインスタンスから継承するタイプは、ダイアグラム上に異なる親クラスを持ちます。
    • クラステンプレートがfoo継承しTTテンプレートタイプパラメータにデフォルトがある場合、そのデフォルトが想定されます。デフォルトとは異なる場所barから継承するタイプがある場合は、親を持ちます。そして、共通の親を持ちません。foo<U>Ubarfoo<U>foo<>bar<U>
    • テンプレートパラメーターの少なくとも1つから継承するクラステンプレートが複数ある場合、Doxygenは、テンプレートタイプパラメーターがコード内でまったく同じ名前である限り、これらのクラステンプレートの共通の親を想定します。これにより、命名の一貫性が向上します。
    • CRTPと逆CRTPが機能します。
    • 再帰的なテンプレート継承ツリーは展開されません。任意のvariantインスタンス化は継承に表示されますvariant<Ts...>
    • インスタンス化のないクラステンプレートが描画されています。それらには、<...>デフォルトを持たないタイプおよび非タイプのパラメーターを表す名前の文字列が含まれます。
    • クラステンプレートの完全および部分的な特殊化も行われています。Doxygenは、特殊化が異なるタイプから継承する場合、正しいグラフを生成します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.