From 5a0f53d75a759ce876e814260ef8f01ec28e9bde Mon Sep 17 00:00:00 2001 From: WandererFan Date: Mon, 8 May 2017 20:43:39 -0400 Subject: [PATCH] Fix #2972 Export Pdf Page Not in Foreground exposes TechDrawGui.exportPageAsPdf(page,file) also adds TechDrawGui.exportPageAsSvg(page,file) --- src/Mod/TechDraw/Gui/AppTechDrawGui.cpp | 30 +-- src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp | 266 ++++++++++++++++------ src/Mod/TechDraw/Gui/MDIViewPage.cpp | 102 +++------ src/Mod/TechDraw/Gui/MDIViewPage.h | 4 + src/Mod/TechDraw/Gui/ViewProviderPage.h | 2 +- 5 files changed, 247 insertions(+), 157 deletions(-) diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp index 1e3946b82c..52e04317dd 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp @@ -29,6 +29,8 @@ #include #include +#include + #include #include #include @@ -67,27 +69,9 @@ void loadTechDrawResource() } namespace TechDrawGui { -class Module : public Py::ExtensionModule -{ -public: - Module() : Py::ExtensionModule("TechDrawGui") - { - initialize("This module is the TechDrawGui module."); // register with Python - } - - virtual ~Module() {} - -private: -}; - -PyObject* initModule() -{ - return (new Module)->module().ptr(); + extern PyObject* initModule(); } -} // namespace TechDrawGui - - /* Python entry */ PyMOD_INIT_FUNC(TechDrawGui) { @@ -95,6 +79,14 @@ PyMOD_INIT_FUNC(TechDrawGui) PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application."); PyMOD_Return(0); } + // load dependent module + try { + Base::Interpreter().loadModule("TechDraw"); + } + catch(const Base::Exception& e) { + PyErr_SetString(PyExc_ImportError, e.what()); + PyMOD_Return(0); + } PyObject* mod = TechDrawGui::initModule(); Base::Console().Log("Loading TechDrawGui module... done\n"); diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp index 64ca5b998b..1cbf252b53 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGuiPy.cpp @@ -1,70 +1,196 @@ -/*************************************************************************** - * Copyright (c) 2006 Werner Mayer * - * * - * This file is part of the FreeCAD CAx development system. * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Library General Public * - * License as published by the Free Software Foundation; either * - * version 2 of the License, or (at your option) any later version. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU Library General Public License for more details. * - * * - * You should have received a copy of the GNU Library General Public * - * License along with this library; see the file COPYING.LIB. If not, * - * write to the Free Software Foundation, Inc., 59 Temple Place, * - * Suite 330, Boston, MA 02111-1307, USA * - * * - ***************************************************************************/ - -#include "PreCompiled.h" -#ifndef _PreComp_ -# include -# include -# include -# include -#endif - -#include "MDIViewPage.h" -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace TechDrawGui; - -//TODO: TechDraw does not open/import/export SVG/DXF files like Drawing. Not sure what belongs here. -//equivalents to GuiCommand for MDIViewPage::saveSVG?, print, printPDF or just make MDIViewPage methods Py accessible? -// -/* module functions */ -static PyObject * -tdGuiPlaceholder(PyObject * /*self*/, PyObject *args) -{ - char* Name; - if (!PyArg_ParseTuple(args, "et","utf-8",&Name)) - return NULL; - std::string EncodedName = std::string(Name); - PyMem_Free(Name); - - PY_TRY { - } PY_CATCH; - - Py_Return; -} - -/* registration table */ -struct PyMethodDef TechDrawGui_Import_methods[] = { - {"tdGuiPlaceholder" ,tdGuiPlaceholder , METH_VARARGS, ""}, /* method name, C func ptr, always-tuple */ - {NULL, NULL, 0, NULL} /* end of table marker */ -}; +/*************************************************************************** + * Copyright (c) WandererFan (wandererfan@gmail.com) 2016 * +* * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +# include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include + +#include "MDIViewPage.h" +#include "ViewProviderPage.h" + +namespace TechDrawGui { +//module level static C++ functions go here +} + +namespace TechDrawGui { + +class Module : public Py::ExtensionModule +{ +public: + Module() : Py::ExtensionModule("TechDrawGui") + { + add_varargs_method("exportPageAsPdf",&Module::exportPageAsPdf, + "exportPageAsPdf(DrawPageObject,FilePath) -- print page as Pdf to file." + ); + add_varargs_method("exportPageAsSvg",&Module::exportPageAsSvg, + "exportPageAsSvg(DrawPageObject,FilePath) -- print page as Svg to file." + ); + initialize("This is a module for displaying drawings"); // register with Python + } + virtual ~Module() {} + +private: + virtual Py::Object invoke_method_varargs(void *method_def, const Py::Tuple &args) + { + try { + return Py::ExtensionModule::invoke_method_varargs(method_def, args); + } + catch (const Standard_Failure &e) { + std::string str; + Standard_CString msg = e.GetMessageString(); + str += typeid(e).name(); + str += " "; + if (msg) {str += msg;} + else {str += "No OCCT Exception Message";} + Base::Console().Error("%s\n", str.c_str()); + throw Py::Exception(Part::PartExceptionOCCError, str); + } + catch (const Base::Exception &e) { + std::string str; + str += "FreeCAD exception thrown ("; + str += e.what(); + str += ")"; + e.ReportException(); + throw Py::RuntimeError(str); + } + catch (const std::exception &e) { + std::string str; + str += "C++ exception thrown ("; + str += e.what(); + str += ")"; + Base::Console().Error("%s\n", str.c_str()); + throw Py::RuntimeError(str); + } + } + +//!exportPageAsPdf(PageObject,FullPath) + Py::Object exportPageAsPdf(const Py::Tuple& args) + { + PyObject *pageObj; + char* name; + if (!PyArg_ParseTuple(args.ptr(), "Oet", &pageObj, "utf-8",&name)) { + throw Py::Exception("expected (Page,path"); + } + + std::string filePath = std::string(name); + PyMem_Free(name); + + try { + App::DocumentObject* obj = 0; + Gui::ViewProvider* vp = 0; + MDIViewPage* mdi = 0; + if (PyObject_TypeCheck(pageObj, &(App::DocumentObjectPy::Type))) { + obj = static_cast(pageObj)->getDocumentObjectPtr(); + vp = Gui::Application::Instance->getViewProvider(obj); + if (vp) { + TechDrawGui::ViewProviderPage* vpp = dynamic_cast(vp); + if (vpp) { + mdi = vpp->getMDIViewPage(); + if (mdi) { + mdi->printPdf(filePath); + } else { + vpp->showMDIViewPage(); + mdi = vpp->getMDIViewPage(); + mdi->printPdf(filePath); + } + } + } + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); + } + + return Py::None(); + } + +//!exportPageAsSvg(PageObject,FullPath) + Py::Object exportPageAsSvg(const Py::Tuple& args) + { + PyObject *pageObj; + char* name; + if (!PyArg_ParseTuple(args.ptr(), "Oet", &pageObj, "utf-8",&name)) { + throw Py::Exception("expected (Page,path"); + } + + std::string filePath = std::string(name); + PyMem_Free(name); + + try { + App::DocumentObject* obj = 0; + Gui::ViewProvider* vp = 0; + MDIViewPage* mdi = 0; + if (PyObject_TypeCheck(pageObj, &(App::DocumentObjectPy::Type))) { + obj = static_cast(pageObj)->getDocumentObjectPtr(); + vp = Gui::Application::Instance->getViewProvider(obj); + if (vp) { + TechDrawGui::ViewProviderPage* vpp = dynamic_cast(vp); + if (vpp) { + mdi = vpp->getMDIViewPage(); + if (mdi) { + mdi->saveSVG(filePath); + } else { + vpp->showMDIViewPage(); + mdi = vpp->getMDIViewPage(); + mdi->saveSVG(filePath); + } + } + } + } + } + catch (Base::Exception &e) { + throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); + } + + return Py::None(); + } + + }; + +PyObject* initModule() +{ + return (new Module)->module().ptr(); +} + +} // namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index 79045882a1..c5e27849c9 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -451,7 +451,6 @@ void MDIViewPage::findMissingViews(const std::vector &list } } - /// Helper function bool MDIViewPage::hasQView(App::DocumentObject *obj) { @@ -556,76 +555,35 @@ void MDIViewPage::onRelabel(Gui::Document *pDoc) void MDIViewPage::printPdf() { - Gui::FileOptionsDialog dlg(this, 0); - dlg.setFileMode(QFileDialog::AnyFile); - dlg.setAcceptMode(QFileDialog::AcceptSave); - dlg.setWindowTitle(tr("Export PDF")); - dlg.setNameFilters(QStringList() << QString::fromLatin1("%1 (*.pdf)").arg(tr("PDF file"))); - - QGridLayout *gridLayout; - QGridLayout *formLayout; - QGroupBox *groupBox; - QListWidget *listWidget; - QListWidgetItem* item; - QWidget *form = new QWidget(&dlg); - form->resize(40, 300); - formLayout = new QGridLayout(form); - groupBox = new QGroupBox(form); - gridLayout = new QGridLayout(groupBox); - listWidget = new QListWidget(groupBox); - gridLayout->addWidget(listWidget, 0, 0, 1, 1); - formLayout->addWidget(groupBox, 0, 0, 1, 1); - - //the "Extended" part of the dialog - //doesn't have any impact on result? - groupBox->setTitle(tr("Page sizes")); - item = new QListWidgetItem(tr("A0"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A0)); - item = new QListWidgetItem(tr("A1"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A1)); - item = new QListWidgetItem(tr("A2"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A2)); - item = new QListWidgetItem(tr("A3"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A3)); - item = new QListWidgetItem(tr("A4"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A4)); - item = new QListWidgetItem(tr("A5"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::A5)); - item = new QListWidgetItem(tr("Letter"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::Letter)); - item = new QListWidgetItem(tr("Legal"), listWidget); - item->setData(Qt::UserRole, QVariant(QPrinter::Legal)); - //listWidget->item(4)->setSelected(true); // by default A4 - int index = 4; // by default A4 - for (int i=0; icount(); i++) { - if (listWidget->item(i)->data(Qt::UserRole).toInt() == m_paperSize) { - index = i; - break; - } + QStringList filter; + filter << QObject::tr("PDF (*.pdf)"); + filter << QObject::tr("All Files (*.*)"); + QString fn = Gui::FileDialog::getSaveFileName(Gui::getMainWindow(), QObject::tr("Export Page As PDF"), + QString(), filter.join(QLatin1String(";;"))); + if (fn.isEmpty()) { + return; } - listWidget->item(index)->setSelected(true); - dlg.setOptionsWidget(Gui::FileOptionsDialog::ExtensionRight, form, false); - if (dlg.exec() == QDialog::Accepted) { - Gui::WaitCursor wc; - QString filename = dlg.selectedFiles().front(); - QPrinter printer(QPrinter::HighResolution); - printer.setFullPage(true); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOutputFileName(filename); - printer.setOrientation(m_orientation); - printer.setPaperSize(m_paperSize); - QList items = listWidget->selectedItems(); - -// if (items.size() == 1) { -// int AX = items.front()->data(Qt::UserRole).toInt(); -// printer.setPaperSize(QPrinter::PaperSize(AX)); -// } - - print(&printer); - } + Gui::WaitCursor wc; + std::string utf8Content = fn.toUtf8().constData(); + printPdf(utf8Content); } +void MDIViewPage::printPdf(std::string file) +{ + if (file.empty()) { + Base::Console().Warning("MDIViewPage - no file specified\n"); + return; + } + QString filename = QString::fromUtf8(file.data(),file.size()); + QPrinter printer(QPrinter::HighResolution); + printer.setFullPage(true); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOutputFileName(filename); + printer.setOrientation(m_orientation); + printer.setPaperSize(m_paperSize); + print(&printer); +} void MDIViewPage::print() { @@ -854,6 +812,16 @@ void MDIViewPage::saveSVG() m_view->saveSvg(fn); } +void MDIViewPage::saveSVG(std::string file) +{ + if (file.empty()) { + Base::Console().Warning("MDIViewPage - no file specified\n"); + return; + } + QString filename = QString::fromUtf8(file.data(),file.size()); + m_view->saveSvg(filename); +} + /////////////// Selection Routines /////////////////// // wf: this is never executed??? diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index 0018bf61ca..59b5d19a0b 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -73,7 +73,11 @@ public: void print(); void print(QPrinter* printer); void printPdf(); + void printPdf(std::string file); void printPreview(); + + void saveSVG(std::string file); + void setFrameState(bool state); bool getFrameState(void) {return m_frameState;}; diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index d740c9e21e..d3a770f41c 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -81,10 +81,10 @@ public: TechDraw::DrawPage* getDrawPage() const; void unsetEdit(int ModNum); MDIViewPage* getMDIViewPage(); + bool showMDIViewPage(); protected: bool setEdit(int ModNum); - bool showMDIViewPage(); private: QPointer m_mdiView;