From 32bacd0b631b94290bf3d1c7ca52b0ad05c65211 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 23 Jan 2016 21:59:22 +0100 Subject: [PATCH] py3: ported Path to python3 --- src/Mod/Path/App/AppPath.cpp | 5 +++- src/Mod/Path/App/CommandPyImp.cpp | 36 +++++++++++++++++++++++++++++ src/Mod/Path/App/PathPy.xml | 2 +- src/Mod/Path/App/PathPyImp.cpp | 8 +++++-- src/Mod/Path/App/TooltablePyImp.cpp | 17 ++++++++++++++ src/Mod/Path/Gui/AppPathGui.cpp | 10 ++++---- 6 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/Mod/Path/App/AppPath.cpp b/src/Mod/Path/App/AppPath.cpp index ab6ffe02e..3acf8b828 100644 --- a/src/Mod/Path/App/AppPath.cpp +++ b/src/Mod/Path/App/AppPath.cpp @@ -27,6 +27,7 @@ #endif #include +#include #include #include "Command.h" @@ -47,7 +48,7 @@ extern PyObject* initModule(); } /* Python entry */ -PyMODINIT_FUNC initPath() +PyMOD_INIT_FUNC(Path) { PyObject* pathModule = Path::initModule(); Base::Console().Log("Loading Path module... done\n"); @@ -74,4 +75,6 @@ PyMODINIT_FUNC initPath() Path::FeatureCompoundPython ::init(); Path::FeatureShape ::init(); Path::FeatureShapePython ::init(); + + PyMOD_Return(pathModule); } diff --git a/src/Mod/Path/App/CommandPyImp.cpp b/src/Mod/Path/App/CommandPyImp.cpp index 9f01e703e..2b1986364 100644 --- a/src/Mod/Path/App/CommandPyImp.cpp +++ b/src/Mod/Path/App/CommandPyImp.cpp @@ -74,15 +74,28 @@ int CommandPy::PyInit(PyObject* args, PyObject* kwd) PyObject *key, *value; Py_ssize_t pos = 0; while (parameters && PyDict_Next(parameters, &pos, &key, &value)) { +#if PY_MAJOR_VERSION >= 3 + if ( !PyObject_TypeCheck(key,&(PyBytes_Type)) || (!PyObject_TypeCheck(value,&(PyFloat_Type)) && !PyObject_TypeCheck(value,&(PyLong_Type))) ) { +#else if ( !PyObject_TypeCheck(key,&(PyString_Type)) || (!PyObject_TypeCheck(value,&(PyFloat_Type)) && !PyObject_TypeCheck(value,&(PyInt_Type))) ) { +#endif PyErr_SetString(PyExc_TypeError, "The dictionary can only contain string:number pairs"); return -1; } +#if PY_MAJOR_VERSION >= 3 + std::string ckey = PyBytes_AsString(key); +#else std::string ckey = PyString_AsString(key); +#endif boost::to_upper(ckey); double cvalue; +#if PY_MAJOR_VERSION >= 3 + if (PyObject_TypeCheck(value,&(PyLong_Type))) { + cvalue = (double)PyLong_AsLong(value); +#else if (PyObject_TypeCheck(value,&(PyInt_Type))) { cvalue = (double)PyInt_AsLong(value); +#endif } else { cvalue = PyFloat_AsDouble(value); } @@ -124,7 +137,11 @@ Py::Dict CommandPy::getParameters(void) const { PyObject *dict = PyDict_New(); for(std::map::iterator i = getCommandPtr()->Parameters.begin(); i != getCommandPtr()->Parameters.end(); ++i) { +#if PY_MAJOR_VERSION >= 3 + PyDict_SetItem(dict,PyBytes_FromString(i->first.c_str()),PyFloat_FromDouble(i->second)); +#else PyDict_SetItem(dict,PyString_FromString(i->first.c_str()),PyFloat_FromDouble(i->second)); +#endif } return Py::Dict(dict); } @@ -135,12 +152,22 @@ void CommandPy::setParameters(Py::Dict arg) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(dict_copy, &pos, &key, &value)) { +#if PY_MAJOR_VERSION >= 3 + if ( PyObject_TypeCheck(key,&(PyBytes_Type)) && (PyObject_TypeCheck(value,&(PyFloat_Type)) || PyObject_TypeCheck(value,&(PyLong_Type)) ) ) { + std::string ckey = PyBytes_AsString(key); +#else if ( PyObject_TypeCheck(key,&(PyString_Type)) && (PyObject_TypeCheck(value,&(PyFloat_Type)) || PyObject_TypeCheck(value,&(PyInt_Type)) ) ) { std::string ckey = PyString_AsString(key); +#endif boost::to_upper(ckey); double cvalue; +#if PY_MAJOR_VERSION >= 3 + if (PyObject_TypeCheck(value,&(PyLong_Type))) { + cvalue = (double)PyLong_AsLong(value); +#else if (PyObject_TypeCheck(value,&(PyInt_Type))) { cvalue = (double)PyInt_AsLong(value); +#endif } else { cvalue = PyFloat_AsDouble(value); } @@ -156,7 +183,11 @@ void CommandPy::setParameters(Py::Dict arg) PyObject* CommandPy::toGCode(PyObject *args) { if (PyArg_ParseTuple(args, "")) { +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromString(getCommandPtr()->toGCode().c_str()); +#else return PyString_FromString(getCommandPtr()->toGCode().c_str()); +#endif } throw Py::Exception("This method accepts no argument"); } @@ -226,8 +257,13 @@ int CommandPy::setCustomAttributes(const char* attr, PyObject* obj) if (isalpha(satt[0])) { boost::to_upper(satt); double cvalue; +#if PY_MAJOR_VERSION >= 3 + if (PyObject_TypeCheck(obj,&(PyLong_Type))) { + cvalue = (double)PyLong_AsLong(obj); +#else if (PyObject_TypeCheck(obj,&(PyInt_Type))) { cvalue = (double)PyInt_AsLong(obj); +#endif } else if (PyObject_TypeCheck(obj,&(PyFloat_Type))) { cvalue = PyFloat_AsDouble(obj); } else { diff --git a/src/Mod/Path/App/PathPy.xml b/src/Mod/Path/App/PathPy.xml index 3522ecec1..6433f0117 100644 --- a/src/Mod/Path/App/PathPy.xml +++ b/src/Mod/Path/App/PathPy.xml @@ -26,7 +26,7 @@ commands (optional) is a list of Path commands the number of commands in this path - + diff --git a/src/Mod/Path/App/PathPyImp.cpp b/src/Mod/Path/App/PathPyImp.cpp index 46817bf33..233a40ecf 100644 --- a/src/Mod/Path/App/PathPyImp.cpp +++ b/src/Mod/Path/App/PathPyImp.cpp @@ -112,9 +112,9 @@ Py::Float PathPy::getLength(void) const return Py::Float(getToolpathPtr()->getLength()); } -Py::Int PathPy::getSize(void) const +Py::Long PathPy::getSize(void) const { - return Py::Int((int)getToolpathPtr()->getSize()); + return Py::Long((long)getToolpathPtr()->getSize()); } // specific methods @@ -178,7 +178,11 @@ PyObject* PathPy::toGCode(PyObject * args) { if (PyArg_ParseTuple(args, "")) { std::string result = getToolpathPtr()->toGCode(); +#if PY_MAJOR_VERSION >= 3 + return PyBytes_FromString(result.c_str()); +#else return PyString_FromString(result.c_str()); +#endif } throw Py::Exception("This method accepts no argument"); } diff --git a/src/Mod/Path/App/TooltablePyImp.cpp b/src/Mod/Path/App/TooltablePyImp.cpp index 0b2ad6607..abae1958e 100644 --- a/src/Mod/Path/App/TooltablePyImp.cpp +++ b/src/Mod/Path/App/TooltablePyImp.cpp @@ -363,11 +363,19 @@ int TooltablePy::PyInit(PyObject* args, PyObject* /*kwd*/) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(pcObj, &pos, &key, &value)) { +#if PY_MAJOR_VERSION >= 3 + if ( !PyObject_TypeCheck(key,&(PyLong_Type)) || !PyObject_TypeCheck(value,&(Path::ToolPy::Type)) ) { +#else if ( !PyObject_TypeCheck(key,&(PyInt_Type)) || !PyObject_TypeCheck(value,&(Path::ToolPy::Type)) ) { +#endif PyErr_SetString(PyExc_TypeError, "The dictionary can only contain int:tool pairs"); return -1; } +#if PY_MAJOR_VERSION >= 3 + int ckey = (int)PyLong_AsLong(key); +#else int ckey = (int)PyInt_AsLong(key); +#endif Path::Tool &tool = *static_cast(value)->getToolPtr(); getTooltablePtr()->setTool(tool,ckey); } @@ -397,7 +405,11 @@ Py::Dict TooltablePy::getTools(void) const PyObject *dict = PyDict_New(); for(std::map::iterator i = getTooltablePtr()->Tools.begin(); i != getTooltablePtr()->Tools.end(); ++i) { PyObject *tool = new Path::ToolPy(i->second); +#if PY_MAJOR_VERSION >= 3 + PyDict_SetItem(dict,PyLong_FromLong(i->first),tool); +#else PyDict_SetItem(dict,PyInt_FromLong(i->first),tool); +#endif } return Py::Dict(dict); } @@ -409,8 +421,13 @@ void TooltablePy::setTools(Py::Dict arg) PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(dict_copy, &pos, &key, &value)) { +#if PY_MAJOR_VERSION >= 3 + if ( PyObject_TypeCheck(key,&(PyLong_Type)) && (PyObject_TypeCheck(value,&(Path::ToolPy::Type))) ) { + int ckey = (int)PyLong_AsLong(key); +#else if ( PyObject_TypeCheck(key,&(PyInt_Type)) && (PyObject_TypeCheck(value,&(Path::ToolPy::Type))) ) { int ckey = (int)PyInt_AsLong(key); +#endif Path::Tool &tool = *static_cast(value)->getToolPtr(); getTooltablePtr()->setTool(tool,ckey); } else { diff --git a/src/Mod/Path/Gui/AppPathGui.cpp b/src/Mod/Path/Gui/AppPathGui.cpp index 3d0545634..714e1595e 100644 --- a/src/Mod/Path/Gui/AppPathGui.cpp +++ b/src/Mod/Path/Gui/AppPathGui.cpp @@ -51,11 +51,11 @@ extern PyObject* initModule(); } /* Python entry */ -PyMODINIT_FUNC initPathGui() +PyMOD_INIT_FUNC(PathGui) { if (!Gui::Application::Instance) { PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application."); - return; + PyMOD_Return(0); } try { Base::Interpreter().runString("import PartGui"); @@ -63,9 +63,9 @@ PyMODINIT_FUNC initPathGui() } catch(const Base::Exception& e) { PyErr_SetString(PyExc_ImportError, e.what()); - return; + PyMOD_Return(0); } - (void)PathGui::initModule(); + PyObject* mod = PathGui::initModule(); Base::Console().Log("Loading GUI of Path module... done\n"); // instantiating the commands @@ -83,4 +83,6 @@ PyMODINIT_FUNC initPathGui() // register preferences pages new Gui::PrefPageProducer ("Path"); + + PyMOD_Return(mod); }