Q&A:Doxygenで自動的にクラス図・コラボレーション図(コミュニケーション図)・呼び出し関係図等を出力するには?
Q:Doxygenで自動的にクラス図・コラボレーション図(コミュニケーション図)・呼び出し図等を出力するには?
A:Graphviz を使用してソースコードから自動生成する。
構造を記述して出力される図については、下記を参照
『Q&A:Doxygenで構造を記述して各種UML図・メッセージシーケンスチャート・フローチャート等を出力するには?』
詳細
Graphviz を使用すれば、ソースコードから各種図を自動生成することができる。
(以下Doxygenコマンド・設定項目は親サイトにリンク)
Graphviz の設定
Graphviz をインストールし下記を設定する。
- DOT_PATH【dotツールのインストールパス】:インストールパス
- HAVE_DOT【dotツールの使用有無】(Wizard-Diagrams-“Use dot tool from th GraphViz package”):YES
- HTML_DYNAMIC_SECTIONS【開閉可能セクションの有効化 (HTML出力のみ)】:図の開閉操作を可能にするには、YES
ここに記述していない設定項目等については、親サイトの図の生成・挿入を参照(フォント・画像フォーマット・dotツールの並行実行数 等)
クラス図・コラボレーション図(コミュニケーション図)
下記設定で、クラス図・コラボレーション図(UML 2 以降:コミュニケーション図)を出力することが可能となる。
- CLASS_GRAPH【クラス図の生成有無】(Wizard-Diagrams-“Class diagrams”):YES
- GRAPHICAL_HIERARCHY【全体のクラス階層図の生成有無】(Wizard-Diagrams-“Overall Class hierrchy”):YES
- COLLABORATION_GRAPH【コラボレーション図の生成有無】(Wizard-Diagrams-“Collaboration diagrams”):YES
- UML_LOOK【クラス図・コラボレーション図のUMLスタイル化】:YES(属性記号等を出力)
コラボレーション図の一部分を個別に設定するには、下記のコマンドを併用する。
呼び出し関係図・被呼び出し関係図
下記設定で、呼び出し関係図・被呼び出し関係図を出力することが可能となる。
- CALL_GRAPH【呼び出し関係図の生成有無】(Wizard-Diagrams-“Call graphs”):YES
- CALLER_GRAPH【被呼び出し関係図の生成有無】(Wizard-Diagrams-“Called by graphs”):YES
一部分を個別に設定するには、下記のコマンドを併用する。
- @callgraph【呼び出し関係図 (生成あり)】
- @hidecallgraph【呼び出し関係図 (生成なし)】
- @callergraph【被呼び出し関係図 (生成あり)】
- @hidecallergraph【被呼び出し関係図 (生成なし)】
ファイル依存関係図
下記設定で、ファイルの依存関係図を出力することが可能となる。
- INCLUDE_GRAPH【ファイルのインクルード関係図】(Wizard-Diagrams-“Include dependency graphs”):YES
- INCLUDED_BY_GRAPH【ファイルの被インクルード関係図】(Wizard-Diagrams-“Included by dependency graphs”):YES
一部分を個別に設定するには、下記のコマンドを併用する。
- @includegraph【ファイルのインクルード関係図の表示】 [1.9.8]
- @hideincludegraph【ファイルのインクルード関係図の非表示】 [1.9.8]
- @includedbygraph【ファイルの被インクルード関係図の表示】 [1.9.8]
- @hideincludedbygraph【ファイルの被インクルード関係図の非表示】 [1.9.8]
出力例
各図の一部を抜粋したもの。(下記の設定で出力)
ファイル
inc_A.h
/// @file
/// ファイルの説明
#include "inc_B.h"
inc_B.h
/// @file
/// ファイルの説明
class.cpp
/// @file
/// ファイルの説明
#include "inc_A.h"
class Class_X {
public:
int varPublic_X;
void method_X() {
}
};
class ParentClass {
private:
int varPrivateParent;
protected:
int varProtectedParent;
Class_X class_X;
public:
int varPublicParent;
void methodParent() {
class_X.method_X();
}
};
class ChildClass_A : ParentClass {
private:
int varPrivateChild_A;
protected:
int varProtectedChild_A;
public:
int varPublicChild_A;
void methodChild_A() {
methodParent();
}
};
class ChildClass_B : ParentClass {
private:
int varPrivateChild_B;
protected:
int varProtectedChild_B;
public:
int varPublicChild_B;
void methodChild_B() {
methodParent();
}
};