Как использовать doxygen для создания диаграмм классов UML из исходного кода C ++

94

Я искал материал, который описывает, как сгенерировать простые диаграммы классов с помощью doxygen, но не нашел. Кто-нибудь может помочь?

Мне нужно создать диаграммы, как показано ниже, из набора файлов C ++. альтернативный текст

Если есть более эффективные инструменты для облегчения этой задачи, дайте мне знать.

программное обеспечение
источник
Вы получили такие диаграммы, включая информацию о типах атрибутов и методов?
IzZy

Ответы:

53

Doxygen создает диаграммы наследования, но я не думаю, что он создаст целую иерархию классов. Это позволяет вам использовать инструмент GraphViz. Если вы используете инструмент внешнего интерфейса Doxygen GUI, вы найдете соответствующие параметры в Step2: -> Wizard tab -> Diagrams. Параметры отношения DOT находятся на вкладке «Эксперт».

DPD
источник
6
Вы сможете перемещаться по всей иерархии, ограничения есть на то, что отображается на диаграмме. Есть пара параметров, которые ограничивают объем графика. DOT_GRAPH_NODES ограничивает количество записей на одной странице, а MAX_DOT_GRAPH_DEPTH ограничивает ее глубину. Установка для них больших значений требует очень много времени для большого проекта.
DanS
Благодарю. У меня это сработало. Я также переопределил несколько параметров в 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
wsdookadr
источник
11
Это не приведет к созданию полной диаграммы классов (например, отношения «многие к одному» между классом A и классом B); только диаграмма наследования, т. е. показывающая отношения суперкласс / подкласс.
stepthom
44

Хм, кажется, это немного старый вопрос, но поскольку я возился с конфигурацией Doxygen последние несколько дней, а моя голова все еще полна текущей информации, давайте попробуем ее -

Я думаю, что в предыдущих ответах это почти есть:

Недостающий вариант - добавить COLLABORATION_GRAPH = YESв Doxyfile. Я предполагаю, что вы можете сделать то же самое где-нибудь в графическом интерфейсе doxywizard (я не использую doxywizard).

Итак, в качестве более полного примера, я обычно использую типичные параметры «Doxyfile», связанные с выводом UML:

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 .

user6092647
источник
Хороший ответ. В своем ответе вы написали «CLASS_DIAGRAMS» вместо «CLASS_GRAPH».
DavidS
Хм, на самом деле, теперь вы подняли этот вопрос, я вижу, что у меня и CLASS_DIAGRAMS = YES, и CLASS_GRAPH = YES. После проверки документации для Doxygen 1.8.9.1 я обнаружил, что на самом деле CLASS_GRAPH = YES переопределяет CLASS_DIAGRAMS = YES, поэтому два параметра взаимодействуют, причем CLASS_GRAPH = YES имеет приоритет. Итак, на самом деле, для целей исходного вопроса, то, что у меня есть, будет работать, тем не менее, хороший улов!
user6092647
вы также можете изменить OUTPUT_DIRECTORY и разрешить РЕКУРСИВНЫЙ поиск
King's jester
Вам также может потребоваться изменить поле RECURSIVEна ДА
prehistoricpenguin
6

Enterprise Architect построит диаграмму UML из импортированного исходного кода.

зооропа
источник
Проголосовали также за ответ на вопрос «Если есть более эффективные инструменты для облегчения этой задачи, дайте мне знать».
Кавейш
5

Я думаю, вам нужно будет отредактировать файл doxys и установить для GENERATE_UML (что-то в этом роде) значение true. И вам необходимо установить dot / graphviz.

фчжоу
источник
12
Вы говорите об опции UML_LOOK?
Дэвид Дориа
@DavidDoria должно быть. Но UML_LOOK не покажет никаких типов данных.
Рууд
2

2 ответа, получивших наибольшее количество голосов, верны. На сегодняшний день единственное, что мне нужно было изменить (из настроек по умолчанию), - это включить генерацию с использованием точки вместо встроенного генератора.

Некоторые важные примечания:

  • Doxygen не будет генерировать фактическую полную диаграмму всех классов в проекте . Для каждой иерархии будет создано отдельное изображение. Если у вас есть несколько несвязанных иерархий классов, вы получите несколько изображений.
  • Все эти диаграммы можно найти в html/inherits.htmlили (из навигации по сайту) classes => classierarchy => «Перейти к текстовой иерархии классов».
  • Это вопрос C ++, поэтому давайте поговорим о шаблонах. Особенно, если вы унаследовали от T.
    • Каждый экземпляр шаблона будет корректно рассматриваться Doxygen как отдельный тип. Типы, которые наследуются от разных экземпляров, будут иметь разные родительские классы на диаграмме.
    • Если шаблон класса fooнаследуется от, Tа Tпараметр типа шаблона имеет значение по умолчанию, будет принято такое значение по умолчанию. Если есть тип, barкоторый наследуется от foo<U>места U, отличного от значения по умолчанию, barбудет иметь foo<U>родительский элемент . foo<>и bar<U>не будет иметь общего родителя.
    • Если существует несколько шаблонов классов, которые наследуются по крайней мере от одного из своих параметров шаблона, Doxygen примет общий родительский элемент для этих шаблонов классов, если параметры типа шаблона имеют точно такие же имена в коде. Это стимулирует последовательность в именовании.
    • CRTP и обратный CRTP просто работают.
    • Деревья рекурсивного наследования шаблонов не раскрываются. variantБудет отображаться любой экземпляр для наследования variant<Ts...>.
    • Отрисовываются шаблоны классов без экземпляров. В <...>их имени будет строка, представляющая параметры типа и не-типа, для которых не было значений по умолчанию.
    • Также прорисовываются полная и частичная специализация шаблонов классов. Doxygen генерирует правильные графики, если специализации наследуются от разных типов.
Xeverous
источник