From e85c41440deeb2d27fb1879d24cb90d51fae4a61 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 7 Sep 2023 08:40:05 +0200 Subject: [PATCH] Gui: fixes issue #9422: Dependency Graph: export to .dot/.gv --- src/Gui/CommandDoc.cpp | 42 ++++++++++++++++++++++++++++++++++++++++ src/Gui/GraphvizView.cpp | 22 +++++++++++++++------ src/Gui/Workbench.cpp | 1 + 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/Gui/CommandDoc.cpp b/src/Gui/CommandDoc.cpp index d0eb36a282..feea11b077 100644 --- a/src/Gui/CommandDoc.cpp +++ b/src/Gui/CommandDoc.cpp @@ -592,6 +592,47 @@ bool StdCmdDependencyGraph::isActive() return (getActiveGuiDocument() ? true : false); } +//=========================================================================== +// Std_ExportDependencyGraph +//=========================================================================== + +DEF_STD_CMD_A(StdCmdExportDependencyGraph) + +StdCmdExportDependencyGraph::StdCmdExportDependencyGraph() + : Command("Std_ExportDependencyGraph") +{ + sGroup = "Tools"; + sMenuText = QT_TR_NOOP("Export dependency graph..."); + sToolTipText = QT_TR_NOOP("Export the dependency graph to a file"); + sStatusTip = QT_TR_NOOP("Export the dependency graph to a file"); + sWhatsThis = "Std_ExportDependencyGraph"; + eType = 0; + //sPixmap = "Std_ExportDependencyGraph"; +} + +void StdCmdExportDependencyGraph::activated(int iMsg) +{ + Q_UNUSED(iMsg); + App::Document* doc = App::GetApplication().getActiveDocument(); + QString format = QString::fromLatin1("%1 (*.gv)").arg(Gui::GraphvizView::tr("Graphviz format")); + QString fn = Gui::FileDialog::getSaveFileName(Gui::getMainWindow(), Gui::GraphvizView::tr("Export graph"), QString(), format); + if (!fn.isEmpty()) { + QFile file(fn); + if (file.open(QFile::WriteOnly)) { + std::stringstream str; + doc->exportGraphviz(str); + QByteArray buffer = QByteArray::fromStdString(str.str()); + file.write(buffer); + file.close(); + } + } +} + +bool StdCmdExportDependencyGraph::isActive() +{ + return (getActiveGuiDocument() ? true : false); +} + //=========================================================================== // Std_New //=========================================================================== @@ -1901,6 +1942,7 @@ void CreateDocCommands() rcCmdMgr.addCommand(new StdCmdExport()); rcCmdMgr.addCommand(new StdCmdMergeProjects()); rcCmdMgr.addCommand(new StdCmdDependencyGraph()); + rcCmdMgr.addCommand(new StdCmdExportDependencyGraph()); rcCmdMgr.addCommand(new StdCmdSave()); rcCmdMgr.addCommand(new StdCmdSaveAs()); diff --git a/src/Gui/GraphvizView.cpp b/src/Gui/GraphvizView.cpp index 2144365455..5d31e4df32 100644 --- a/src/Gui/GraphvizView.cpp +++ b/src/Gui/GraphvizView.cpp @@ -441,35 +441,45 @@ QByteArray GraphvizView::exportGraph(const QString& format) return dotProc.readAll(); } -bool GraphvizView::onMsg(const char* pMsg,const char**) +bool GraphvizView::onMsg(const char* pMsg, const char**) { if (strcmp("Save",pMsg) == 0 || strcmp("SaveAs",pMsg) == 0) { QList< QPair > formatMap; + formatMap << qMakePair(QString::fromLatin1("%1 (*.gv)").arg(tr("Graphviz format")), QString::fromLatin1("gv")); formatMap << qMakePair(QString::fromLatin1("%1 (*.png)").arg(tr("PNG format")), QString::fromLatin1("png")); formatMap << qMakePair(QString::fromLatin1("%1 (*.bmp)").arg(tr("Bitmap format")), QString::fromLatin1("bmp")); formatMap << qMakePair(QString::fromLatin1("%1 (*.gif)").arg(tr("GIF format")), QString::fromLatin1("gif")); formatMap << qMakePair(QString::fromLatin1("%1 (*.jpg)").arg(tr("JPG format")), QString::fromLatin1("jpg")); formatMap << qMakePair(QString::fromLatin1("%1 (*.svg)").arg(tr("SVG format")), QString::fromLatin1("svg")); formatMap << qMakePair(QString::fromLatin1("%1 (*.pdf)").arg(tr("PDF format")), QString::fromLatin1("pdf")); - //formatMap << qMakePair(tr("VRML format (*.vrml)"), QString::fromLatin1("vrml")); QStringList filter; - for (const auto & it : formatMap) + for (const auto & it : qAsConst(formatMap)) { filter << it.first; + } QString selectedFilter; QString fn = Gui::FileDialog::getSaveFileName(this, tr("Export graph"), QString(), filter.join(QLatin1String(";;")), &selectedFilter); if (!fn.isEmpty()) { QString format; - for (const auto & it : formatMap) { + for (const auto & it : qAsConst(formatMap)) { if (selectedFilter == it.first) { format = it.second; break; } } - QByteArray buffer = exportGraph(format); - if (buffer.isEmpty()) + QByteArray buffer; + if (format == QLatin1String("gv")) { + std::stringstream str; + doc.exportGraphviz(str); + buffer = QByteArray::fromStdString(str.str()); + } + else { + buffer = exportGraph(format); + } + if (buffer.isEmpty()) { return true; + } QFile file(fn); if (file.open(QFile::WriteOnly)) { file.write(buffer); diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index eb2a7d5236..eac08c3872 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -702,6 +702,7 @@ MenuItem* StdWorkbench::setupMenuBar() const << "Std_ViewLoadImage" << "Std_SceneInspector" << "Std_DependencyGraph" + << "Std_ExportDependencyGraph" << "Std_ProjectUtil" << "Separator" << "Std_MeasureDistance"