Як використовувати doxygen для створення діаграм класів UML із джерела C ++


90

Я шукав якийсь матеріал, який описує, як створити прості діаграми класів за допомогою доксигену, але не зміг знайти. Хто-небудь може допомогти?

Мені потрібно створити схеми, як показано нижче, з набору файлів C ++. текст заміщення

Якщо є кращі інструменти, щоб досягти цього простіше, повідомте мене про це.


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

Відповіді:


50

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


6
Ви зможете орієнтуватися по всій ієрархії, обмеження на те, що відображається на діаграмі. Існує пара параметрів, які обмежують область дії графіку. DOT_GRAPH_NODES обмежує кількість записів на одній сторінці, а MAX_DOT_GRAPH_DEPTH обмежує, наскільки глибоко це йде. Встановлення великих значень робить для великого проекту дуже трудомістким.
DanS

Дякую. У мене це спрацювало. Я також перевизначив кілька варіантів у Expert-> Dot
tsenapathy

46

Цитата з цього допису (це написано самим автором доксигену):

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); лише діаграма успадкування, тобто показ взаємозв’язків суперкласу / підкласу.
вітчим

39

Хм, це, здається, трохи давнє запитання, але оскільки я возився з конфігурацією Doxygen останні кілька днів, поки моя голова все ще повна поточної інформації, давайте вдаримося по ній -

Я думаю, що попередні відповіді майже мають це:

Відсутній варіант - додати COLLABORATION_GRAPH = YES до файлу Doxy. Я припускаю, що ви можете зробити рівнозначну річ десь у графічному інтерфейсі 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).

Залежно від вашої мети для "розгортання" виходу кисню, налаштування 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 _DIAGRAMS" замість цього, якщо "CLASS_GRAPH".
DavidS

Хм, насправді, тепер ви піднімаєте це, я бачу, у мене є CLASS_DIAGRAMS = ТАК і CLASS_GRAPH = ТАК Перевіривши документи для Doxygen 1.8.9.1, я виявив, що фактично CLASS_GRAPH = YES замінить CLASS_DIAGRAMS = YES, тому обидва варіанти взаємодіють, причому CLASS_GRAPH = YES має перевагу. Отже, насправді для цілей оригінального запитання працюватиме те, що у мене є, тим не менш хороший улов!
user6092647

Ви також можете змінити OUTPUT_DIRECTORY і дозволити РЕКУРСИВНИЙ пошук
Кінга

Можливо, вам також доведеться змінити RECURSIVEподану на ТАК
доісторичний

6

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


Проголосував також за відповідь на запитання "Якщо є кращі інструменти, щоб досягти цього простіше, повідомте мене про це".
kaveish

5

Я думаю, вам потрібно буде відредагувати файл doxys і встановити для GENERATE_UML (щось подібне) значення true. І вам потрібно встановити dot / graphviz.


12
Ви говорите про параметр UML_LOOK?
Девід Дорія,

@DavidDoria повинна бути. Але UML_LOOK не відображатиме жодних типів даних.
Ruud Verhoef

2

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

Деякі важливі примітки:

  • Doxygen не створить фактичну повну діаграму всіх класів у проекті . Він створить окреме зображення для кожної ієрархії. Якщо у вас кілька ієрархій класів, не пов’язаних між собою, ви отримаєте кілька зображень.
  • Усі ці діаграми можна знайти в html/inherits.htmlкласах або (за допомогою навігації веб-сайтом) => ієрархія класів => "Перейти до ієрархії текстових класів".
  • Це питання на C ++, тож давайте поговоримо про шаблони. Особливо, якщо ви успадковуєте від T.
    • Кожна інстанція шаблону буде правильно вважатися іншим типом Doxygen. Типи, які успадковуються з різних екземплярів, матимуть на схемі різні батьківські класи.
    • Якщо шаблон класу fooуспадковується від Tі Tпараметр типу шаблону має значення за замовчуванням, буде прийнято таке значення за замовчуванням. Якщо існує тип, barякий успадковує foo<U>звідки Uінше, ніж за замовчуванням, barматиме foo<U>батьківський. foo<>і bar<U>не матиме спільного батька.
    • Якщо існує декілька шаблонів класів, які успадковуються принаймні з одного із їх параметрів шаблону, Doxygen вважатиме загальним батьківським для цих шаблонів класів, якщо параметри типу шаблону мають абсолютно однакові імена в коді. Це стимулює до послідовності іменування.
    • CRTP і зворотний CRTP просто працюють.
    • Дерева рекурсивного спадкування не розширюються. Будь-яка variantінстанція буде відображена для успадкування від variant<Ts...>.
    • Малюються шаблони класів без екземплярів. Вони матимуть <...>рядок у своєму назві, що представляє параметри типу та нетипу, які не мали стандартних значень.
    • Також складаються шаблони класів повної та часткової спеціалізації. Кисень генерує правильні графіки, якщо спеціалізації успадковуються від різних типів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.