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

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

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

Если есть лучшие инструменты для достижения этой цели, пожалуйста, дайте мне знать.


person softwarematter    schedule 21.01.2011    source источник
comment
Вы получили такие диаграммы, включая информацию о типах атрибутов и методов?   -  person IzZy    schedule 28.08.2020


Ответы (6)


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

person DPD    schedule 21.01.2011
comment
Вы сможете перемещаться по всей иерархии, ограничения на то, что отображается на диаграмме. Есть пара параметров, которые ограничивают объем графика. DOT_GRAPH_NODES ограничивает количество записей на одной странице, а MAX_DOT_GRAPH_DEPTH ограничивает ее глубину. Если задать для них большие значения, для большого проекта потребуется очень много времени. - person DanS; 21.01.2011
comment
Спасибо. Это сработало для меня. Я также переопределил несколько опций в Expert-›Dot. - person tsenapathy; 07.04.2020

Хм, кажется, это немного старый вопрос, но, поскольку последние несколько дней я возился с конфигурацией 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.

person user6092647    schedule 12.07.2016
comment
Хороший ответ. В своем ответе вы написали CLASS _DIAGRAMS вместо CLASS_GRAPH. - person DavidS; 13.07.2016
comment
Хм, на самом деле, теперь, когда вы поднимаете этот вопрос, я вижу, что у меня есть и CLASS_DIAGRAMS = YES, и CLASS_GRAPH = YES. После проверки документов для Doxygen 1.8.9.1 я обнаружил, что на самом деле CLASS_GRAPH = YES переопределяет CLASS_DIAGRAMS = YES, поэтому эти два параметра взаимодействуют, причем CLASS_GRAPH = YES имеет приоритет. Итак, на самом деле, для целей исходного вопроса то, что у меня есть, будет работать, тем не менее, хороший улов! - person user6092647; 14.07.2016
comment
вы также можете изменить OUTPUT_DIRECTORY и разрешить рекурсивный поиск - person Ben_LCDB; 09.08.2017
comment
Вам также может понадобиться изменить поле RECURSIVE на YES. - person prehistoricpenguin; 15.07.2020
comment
Это помогло. Но, кроме того, может потребоваться еще одно изменение: используйте полный путь для DOT_PATH (например, C:\program files\Graphwiz2.20\bin). Я получил это от doxygen.10944.n7.nabble.com/ - person venk; 27.02.2021
comment
В зависимости от потребностей, все полезные комментарии! Это индивидуальные предпочтения, не упомянутые в исходном вопросе, поэтому я имел в виду все, что я имел в виду, когда сказал, что документация Doxygen действительно ваш друг, но, я думаю, не повредит указать их здесь (ИМХО). - person user6092647; 17.03.2021

Цитата из этот пост (он написан самим автором 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
person wsdookadr    schedule 06.03.2013
comment
Это не создаст полную диаграмму классов (например, отношение «многие к одному» между классом A и классом B); только диаграмма наследования, т. е. показывающая отношения суперкласса/подкласса. - person stepthom; 27.02.2015

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

person zooropa    schedule 30.07.2014
comment
Проголосовал также за ответ на вопрос. Если есть лучшие инструменты для облегчения этого, дайте мне знать. - person kaveish; 12.08.2016

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

person fzhou    schedule 21.01.2011
comment
Вы говорите об опции UML_LOOK? - person David Doria; 17.01.2012
comment
@DavidDoria должно быть. Но UML_LOOK не будет отображать никаких типов данных. - person Ruud Verhoef; 29.11.2019

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

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

  • Doxygen не будет генерировать фактическую полную диаграмму всех классов в проекте. Для каждой иерархии будет создано отдельное изображение. Если у вас есть несколько несвязанных иерархий классов, вы получите несколько изображений.
  • Все эти схемы можно найти в html/inherits.html или (из навигации по сайту) классы => иерархия классов => "Перейти к текстовой иерархии классов".
  • This is a C++ question, so let's talk about templates. Especially if you inherit from T.
    • Each template instantiation will be correctly considered a different type by Doxygen. Types which inherit from different instantations will have different parent classes on the diagram.
    • Если шаблон класса foo наследуется от T и параметр типа шаблона T имеет значение по умолчанию, такое значение будет принято. Если существует тип bar, который наследуется от foo<U>, где U отличается от значения по умолчанию, bar будет иметь родителя foo<U>. foo<> и bar<U> не будут иметь общего родителя.
    • Если существует несколько шаблонов классов, которые наследуют хотя бы один из параметров своего шаблона, Doxygen будет предполагать общего родителя для этих шаблонов классов, если параметры типа шаблона имеют точно такие же имена в коде. Это стимулирует последовательность в именовании.
    • CRTP и обратный CRTP просто работают.
    • Рекурсивные деревья наследования шаблонов не раскрываются. Будет показано, что любой экземпляр variant наследуется от variant<Ts...>.
    • Рисуются шаблоны классов без инстанций. В их имени будет строка <...>, представляющая тип и нетиповые параметры, для которых не было значений по умолчанию.
    • Также отрисовываются шаблоны классов полной и частичной специализаций. Doxygen генерирует правильные графы, если специализации наследуются от разных типов.
person Xeverous    schedule 19.01.2020