diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 9f55ff52a2..64e614cd9a 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -203,6 +203,11 @@ PyDoc_STRVAR(FreeCAD_doc, PyDoc_STRVAR(Console_doc, "FreeCAD Console\n" ); + +PyDoc_STRVAR(Base_doc, + "The Base module contains the classes for the geometric basics\n" + "like vector, matrix, bounding box, placement, rotation, axis, ...\n" + ); Application::Application(std::map &mConfig) : _mConfig(mConfig), _pActiveDoc(0) @@ -214,10 +219,21 @@ Application::Application(std::map &mConfig) // setting up Python binding Base::PyGILStateLocker lock; +#if PY_MAJOR_VERSION >= 3 + static struct PyModuleDef FreeCADModuleDef = {PyModuleDef_HEAD_INIT,"FreeCAD", FreeCAD_doc, -1, Application::Methods}; + PyObject* pAppModule = PyModule_Create(&FreeCADModuleDef); + _PyImport_FixupBuiltin(pAppModule, "FreeCAD"); +#else PyObject* pAppModule = Py_InitModule3("FreeCAD", Application::Methods, FreeCAD_doc); +#endif Py::Module(pAppModule).setAttr(std::string("ActiveDocument"),Py::None()); +#if PY_MAJOR_VERSION >= 3 + static struct PyModuleDef ConsoleModuleDef = {PyModuleDef_HEAD_INIT, "__FreeCADConsole__", Console_doc, -1, ConsoleSingleton::Methods}; + PyObject* pConsoleModule = PyModule_Create(&ConsoleModuleDef); +#else PyObject* pConsoleModule = Py_InitModule3("__FreeCADConsole__", ConsoleSingleton::Methods, Console_doc); +#endif // introducing additional classes @@ -234,11 +250,13 @@ Application::Application(std::map &mConfig) // Note: Create an own module 'Base' which should provide the python // binding classes from the base module. At a later stage we should // remove these types from the FreeCAD module. - PyObject* pBaseModule = Py_InitModule3("__FreeCADBase__", NULL, - "The Base module contains the classes for the geometric basics\n" - "like vector, matrix, bounding box, placement, rotation, axis, ..."); - // Python exceptions +#if PY_MAJOR_VERSION >= 3 + static struct PyModuleDef BaseModuleDef = {PyModuleDef_HEAD_INIT, "__FreeCADBase__", Base_doc, -1, NULL}; + PyObject* pBaseModule = PyModule_Create(&BaseModuleDef); +#else + PyObject* pBaseModule = Py_InitModule3("__FreeCADBase__", NULL, Base_doc); +#endif Base::BaseExceptionFreeCADError = PyErr_NewException("Base.FreeCADError", PyExc_RuntimeError, NULL); Py_INCREF(Base::BaseExceptionFreeCADError); PyModule_AddObject(pBaseModule, "FreeCADError", Base::BaseExceptionFreeCADError); @@ -260,11 +278,17 @@ Application::Application(std::map &mConfig) PyModule_AddObject(pAppModule, "Console", pConsoleModule); //insert Units module - PyObject* pUnitsModule = Py_InitModule3("Units", Base::UnitsApi::Methods, - "The Unit API"); +#if PY_MAJOR_VERSION >= 3 + static struct PyModuleDef UnitsModuleDef = {PyModuleDef_HEAD_INIT, "Units", "The Unit API", -1, Base::UnitsApi::Methods}; + PyObject* pUnitsModule = PyModule_Create(&UnitsModuleDef); +#else + PyObject* pUnitsModule = Py_InitModule3("Units", Base::UnitsApi::Methods,"The Unit API"); +#endif Base::Interpreter().addType(&Base::QuantityPy ::Type,pUnitsModule,"Quantity"); // make sure to set the 'nb_true_divide' slot +#if PY_MAJOR_VERSION < 3 Base::QuantityPy::Type.tp_as_number->nb_true_divide = Base::QuantityPy::Type.tp_as_number->nb_divide; +#endif Base::Interpreter().addType(&Base::UnitPy ::Type,pUnitsModule,"Unit"); Py_INCREF(pUnitsModule); @@ -1427,10 +1451,14 @@ void Application::initApplication(void) // starting the init script Console().Log("Run App init script\n"); - Interpreter().runString(Base::ScriptFactory().ProduceScript("CMakeVariables")); - Interpreter().runString(Base::ScriptFactory().ProduceScript("FreeCADInit")); - - ObjectLabelObserver::instance(); + try { + Interpreter().runString(Base::ScriptFactory().ProduceScript("CMakeVariables")); + Interpreter().runString(Base::ScriptFactory().ProduceScript("FreeCADInit")); + ObjectLabelObserver::instance(); + } + catch (const Base::Exception& e) { + Base::Console().Error("%s\n", e.what()); + } } std::list Application::getCmdLineFiles() diff --git a/src/App/ApplicationPy.cpp b/src/App/ApplicationPy.cpp index cdfeff0d55..20df82918a 100644 --- a/src/App/ApplicationPy.cpp +++ b/src/App/ApplicationPy.cpp @@ -352,7 +352,11 @@ PyObject* Application::sGetConfig(PyObject * /*self*/, PyObject *args,PyObject * } else { // do not set an error because this may break existing python code +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromString(""); +#else return PyString_FromString(""); +#endif } } @@ -364,7 +368,11 @@ PyObject* Application::sDumpConfig(PyObject * /*self*/, PyObject *args,PyObject PyObject *dict = PyDict_New(); for (std::map::iterator It= GetApplication()._mConfig.begin(); It!=GetApplication()._mConfig.end();++It) { +#if PY_MAJOR_VERSION >= 3 + PyDict_SetItemString(dict,It->first.c_str(), PyUnicode_FromString(It->second.c_str())); +#else PyDict_SetItemString(dict,It->first.c_str(), PyString_FromString(It->second.c_str())); +#endif } return dict; } @@ -559,7 +567,11 @@ PyObject* Application::sListDocuments(PyObject * /*self*/, PyObject *args,PyObje for (std::map::const_iterator It = GetApplication().DocMap.begin(); It != GetApplication().DocMap.end();++It) { +#if PY_MAJOR_VERSION >= 3 + pKey = PyUnicode_FromString(It->first.c_str()); +#else pKey = PyString_FromString(It->first.c_str()); +#endif // GetPyObject() increments pValue = static_cast(It->second->getPyObject()); PyDict_SetItem(pDict, pKey, pValue);