From 36383135a8dba48a1c47a54732320b720c0fc509 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 17 Jan 2016 23:15:24 +0100 Subject: [PATCH] + simplify porting of Spreadsheet module to Python3 --- src/Mod/Spreadsheet/App/AppSpreadsheet.cpp | 30 ++++--- src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp | 88 +++++++++++++++---- .../Spreadsheet/Gui/AppSpreadsheetGuiPy.cpp | 71 --------------- src/Mod/Spreadsheet/Gui/CMakeLists.txt | 1 - 4 files changed, 91 insertions(+), 99 deletions(-) delete mode 100644 src/Mod/Spreadsheet/Gui/AppSpreadsheetGuiPy.cpp diff --git a/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp b/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp index a8bdd4ff2..3b9a17ec6 100644 --- a/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp +++ b/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp @@ -15,22 +15,31 @@ # include #endif +#include +#include + #include #include "Sheet.h" #include "SpreadsheetExpression.h" -/* registration table */ -static struct PyMethodDef Spreadsheet_methods[] = { - {NULL, NULL} /* end of table marker */ +namespace Spreadsheet { +class Module : public Py::ExtensionModule +{ +public: + Module() : Py::ExtensionModule("Spreadsheet") + { + initialize("This module is the Spreadsheet module."); // register with Python + } + + virtual ~Module() {} + +private: }; +} // namespace Spreadsheet /* Python entry */ -extern "C" { -void SpreadsheetExport initSpreadsheet() { - (void) Py_InitModule("Spreadsheet", Spreadsheet_methods); /* mod name, table ptr */ - Base::Console().Log("Loading Spreadsheet module... done\n"); - +PyMODINIT_FUNC initSpreadsheet() { Spreadsheet::PropertySpreadsheetQuantity::init(); Spreadsheet::PropertyColumnWidths::init(); Spreadsheet::PropertyRowHeights::init(); @@ -40,7 +49,6 @@ void SpreadsheetExport initSpreadsheet() { Spreadsheet::AggregateFunctionExpression::init(); Spreadsheet::RangeExpression::init(); - return; + new Spreadsheet::Module(); + Base::Console().Log("Loading Spreadsheet module... done\n"); } - -} // extern "C" diff --git a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp index a270b4efa..486ad38d1 100644 --- a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp +++ b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp @@ -1,12 +1,23 @@ /*************************************************************************** + * Copyright (c) 2015 Eivind Kvedalen (eivind@kvedalen.name) * + * Copyright (c) 2006 Werner Mayer * * * - * This program 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. * - * for detail see the LICENCE text file. * - * Jrgen Riegel 2002 * - * Eivind Kvedalen 2015 * + * 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 * * * ***************************************************************************/ @@ -14,11 +25,24 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include +# include +# include +# include #endif +#include +#include + #include +#include +#include +#include +#include +#include #include +#include #include +#include #include "Workbench.h" #include "ViewProviderSpreadsheet.h" #include "SpreadsheetView.h" @@ -33,22 +57,53 @@ void loadSpreadsheetResource() Gui::Translator::instance()->refresh(); } -/* registration table */ -extern struct PyMethodDef SpreadsheetGui_Import_methods[]; +namespace SpreadsheetGui { +class Module : public Py::ExtensionModule +{ +public: + Module() : Py::ExtensionModule("SpreadsheetGui") + { + add_varargs_method("open",&Module::open + ); + initialize("This module is the SpreadsheetGui module."); // register with Python + } + + virtual ~Module() {} + +private: + Py::Object open(const Py::Tuple& args) + { + const char* Name; + const char* DocName=0; + if (!PyArg_ParseTuple(args.ptr(), "s|s",&Name,&DocName)) + throw Py::Exception(); + + try { + Base::FileInfo file(Name); + App::Document *pcDoc = App::GetApplication().newDocument(DocName ? DocName : QT_TR_NOOP("Unnamed")); + Spreadsheet::Sheet *pcSheet = static_cast(pcDoc->addObject("Spreadsheet::Sheet", file.fileNamePure().c_str())); + + pcSheet->importFromFile(Name, '\t', '"', '\\'); + pcSheet->execute(); + } + catch (const Base::Exception& e) { + throw Py::RuntimeError(e.what()); + } + + return Py::None(); + } +}; +} // namespace SpreadsheetGui /* Python entry */ -extern "C" { -void SpreadsheetGuiExport initSpreadsheetGui() +PyMODINIT_FUNC initSpreadsheetGui() { if (!Gui::Application::Instance) { PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application."); return; } - (void) Py_InitModule("SpreadsheetGui", SpreadsheetGui_Import_methods); /* mod name, table ptr */ - Base::Console().Log("Loading GUI of Spreadsheet module... done\n"); - // instantiating the commands CreateSpreadsheetCommands(); @@ -58,6 +113,7 @@ void SpreadsheetGuiExport initSpreadsheetGui() // add resources and reloads the translators loadSpreadsheetResource(); -} -} // extern "C" { + new SpreadsheetGui::Module(); + Base::Console().Log("Loading GUI of Spreadsheet module... done\n"); +} diff --git a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGuiPy.cpp b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGuiPy.cpp deleted file mode 100644 index 1e54c107f..000000000 --- a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGuiPy.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2015 Eivind Kvedalen (eivind@kvedalen.name) * - * 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 -#endif - -#include "SpreadsheetView.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace SpreadsheetGui; -using namespace Spreadsheet; - -/* module functions */ -static PyObject * -open(PyObject *self, PyObject *args) -{ - const char* Name; - const char* DocName=0; - if (!PyArg_ParseTuple(args, "s|s",&Name,&DocName)) - return NULL; - - PY_TRY { - Base::FileInfo file(Name); - App::Document *pcDoc = App::GetApplication().newDocument(DocName ? DocName : QT_TR_NOOP("Unnamed")); - Sheet *pcSheet = (Sheet *)pcDoc->addObject("Spreadsheet::Sheet", file.fileNamePure().c_str()); - - pcSheet->importFromFile(Name, '\t', '"', '\\'); - pcSheet->execute(); - } PY_CATCH; - - Py_Return; -} - -/* registration table */ -struct PyMethodDef SpreadsheetGui_Import_methods[] = { - {"open" ,open , 1}, /* method name, C func ptr, always-tuple */ - {NULL, NULL} /* end of table marker */ -}; diff --git a/src/Mod/Spreadsheet/Gui/CMakeLists.txt b/src/Mod/Spreadsheet/Gui/CMakeLists.txt index 8f27a0392..439b05b7e 100644 --- a/src/Mod/Spreadsheet/Gui/CMakeLists.txt +++ b/src/Mod/Spreadsheet/Gui/CMakeLists.txt @@ -53,7 +53,6 @@ SET(SpreadsheetGui_SRCS # ${SpreadsheetGui_MOC_SRCS} ${SpreadsheetGui_QRC_SRCS} AppSpreadsheetGui.cpp - AppSpreadsheetGuiPy.cpp Command.cpp LineEdit.h LineEdit.cpp