diff --git a/src/Mod/PartDesign/App/AppPartDesign.cpp b/src/Mod/PartDesign/App/AppPartDesign.cpp index ee6f6c06060c..18f96394c4b5 100644 --- a/src/Mod/PartDesign/App/AppPartDesign.cpp +++ b/src/Mod/PartDesign/App/AppPartDesign.cpp @@ -49,15 +49,12 @@ #include "FeatureMultiTransform.h" #include "FeatureHole.h" -extern struct PyMethodDef PartDesign_methods[]; - -PyDoc_STRVAR(module_PartDesign_doc, -"This module is the PartDesign module."); - +namespace PartDesign { +extern PyObject* initModule(); +} /* Python entry */ -extern "C" { -void PartDesignExport init_PartDesign() +PyMODINIT_FUNC init_PartDesign() { // load dependent module try { @@ -68,7 +65,8 @@ void PartDesignExport init_PartDesign() PyErr_SetString(PyExc_ImportError, e.what()); return; } - Py_InitModule3("_PartDesign", PartDesign_methods, module_PartDesign_doc); /* mod name, table ptr */ + + (void)PartDesign::initModule(); Base::Console().Log("Loading PartDesign module... done\n"); @@ -97,5 +95,3 @@ void PartDesignExport init_PartDesign() PartDesign::Chamfer ::init(); PartDesign::Draft ::init(); } - -} // extern "C" diff --git a/src/Mod/PartDesign/App/AppPartDesignPy.cpp b/src/Mod/PartDesign/App/AppPartDesignPy.cpp index d6da54513fec..c200ab40ebcd 100644 --- a/src/Mod/PartDesign/App/AppPartDesignPy.cpp +++ b/src/Mod/PartDesign/App/AppPartDesignPy.cpp @@ -26,78 +26,96 @@ # include #endif +#include +#include + #include #include #include -static PyObject * makeFilletArc(PyObject *self, PyObject *args) +namespace PartDesign { +class Module : public Py::ExtensionModule { - PyObject *pM1; - PyObject *pP; - PyObject *pQ; - PyObject *pN; - double r2; - int ccw; - if (!PyArg_ParseTuple(args, "O!O!O!O!di", - &(Base::VectorPy::Type), &pM1, - &(Base::VectorPy::Type), &pP, - &(Base::VectorPy::Type), &pQ, - &(Base::VectorPy::Type), &pN, - &r2, &ccw)) - return NULL; - - Base::Vector3d M1 = Py::Vector(pM1, false).toVector(); - Base::Vector3d P = Py::Vector(pP, false).toVector(); - Base::Vector3d Q = Py::Vector(pQ, false).toVector(); - Base::Vector3d N = Py::Vector(pN, false).toVector(); - - Base::Vector3d u = Q - P; - Base::Vector3d v = P - M1; - Base::Vector3d b; - if (ccw) - b = u % N; - else - b = N % u; - b.Normalize(); - - double uu = u * u; - double uv = u * v; - double r1 = v.Length(); - - // distinguish between internal and external fillets - r2 *= Base::sgn(uv); - - double cc = 2.0 * r2 * (b * v - r1); - double d = uv * uv - uu * cc; - if (d < 0) { - PyErr_SetString(Base::BaseExceptionFreeCADError, "Unable to caluclate intersection points"); - return NULL; +public: + Module() : Py::ExtensionModule("_PartDesign") + { + add_varargs_method("makeFilletArc",&Module::makeFilletArc, + "makeFilletArc(...) -- Fillet arc." + ); + initialize("This module is the PartDesign module."); // register with Python } - double t; - double t1 = (-uv + sqrt(d)) / uu; - double t2 = (-uv - sqrt(d)) / uu; + virtual ~Module() {} - if (fabs(t1) < fabs(t2)) - t = t1; - else - t = t2; +private: + Py::Object makeFilletArc(const Py::Tuple& args) + { + PyObject *pM1; + PyObject *pP; + PyObject *pQ; + PyObject *pN; + double r2; + int ccw; + if (!PyArg_ParseTuple(args.ptr(), "O!O!O!O!di", + &(Base::VectorPy::Type), &pM1, + &(Base::VectorPy::Type), &pP, + &(Base::VectorPy::Type), &pQ, + &(Base::VectorPy::Type), &pN, + &r2, &ccw)) + throw Py::Exception(); - Base::Vector3d M2 = P + (u*t) + (b*r2); - Base::Vector3d S1 = (r2 * M1 + r1 * M2)/(r1+r2); - Base::Vector3d S2 = M2 - (b*r2); + Base::Vector3d M1 = Py::Vector(pM1, false).toVector(); + Base::Vector3d P = Py::Vector(pP, false).toVector(); + Base::Vector3d Q = Py::Vector(pQ, false).toVector(); + Base::Vector3d N = Py::Vector(pN, false).toVector(); - Py::Tuple tuple(3); - tuple.setItem(0, Py::Vector(S1)); - tuple.setItem(1, Py::Vector(S2)); - tuple.setItem(2, Py::Vector(M2)); + Base::Vector3d u = Q - P; + Base::Vector3d v = P - M1; + Base::Vector3d b; + if (ccw) + b = u % N; + else + b = N % u; + b.Normalize(); - return Py::new_reference_to(tuple); -} + double uu = u * u; + double uv = u * v; + double r1 = v.Length(); + + // distinguish between internal and external fillets + r2 *= Base::sgn(uv); + + double cc = 2.0 * r2 * (b * v - r1); + double d = uv * uv - uu * cc; + if (d < 0) { + throw Py::RuntimeError("Unable to caluclate intersection points"); + } + + double t; + double t1 = (-uv + sqrt(d)) / uu; + double t2 = (-uv - sqrt(d)) / uu; + + if (fabs(t1) < fabs(t2)) + t = t1; + else + t = t2; + + Base::Vector3d M2 = P + (u*t) + (b*r2); + Base::Vector3d S1 = (r2 * M1 + r1 * M2)/(r1+r2); + Base::Vector3d S2 = M2 - (b*r2); -/* registration table */ -struct PyMethodDef PartDesign_methods[] = { - {"makeFilletArc" ,makeFilletArc,METH_VARARGS, - "makeFilletArc(...) -- Fillet arc."}, - {NULL, NULL} /* end of table marker */ + Py::Tuple tuple(3); + tuple.setItem(0, Py::Vector(S1)); + tuple.setItem(1, Py::Vector(S2)); + tuple.setItem(2, Py::Vector(M2)); + + return tuple; + } }; + +PyObject* initModule() +{ + return (new Module)->module().ptr(); +} + +} // namespace PartDesign diff --git a/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp b/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp index 6fe67cbcc66e..af202d08c216 100644 --- a/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp +++ b/src/Mod/PartDesign/Gui/AppPartDesignGui.cpp @@ -26,6 +26,9 @@ # include #endif +#include +#include + #include #include #include @@ -55,13 +58,30 @@ void loadPartDesignResource() Gui::Translator::instance()->refresh(); } -/* registration table */ -extern struct PyMethodDef PartDesignGui_Import_methods[]; +namespace PartDesignGui { +class Module : public Py::ExtensionModule +{ +public: + Module() : Py::ExtensionModule("PartDesignGui") + { + initialize("This module is the PartDesignGui module."); // register with Python + } + + virtual ~Module() {} + +private: +}; + +PyObject* initModule() +{ + return (new Module)->module().ptr(); +} + +} // namespace PartDesignGui /* Python entry */ -extern "C" { -void PartDesignGuiExport initPartDesignGui() +PyMODINIT_FUNC initPartDesignGui() { if (!Gui::Application::Instance) { PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application."); @@ -77,7 +97,7 @@ void PartDesignGuiExport initPartDesignGui() return; } - (void) Py_InitModule("PartDesignGui", PartDesignGui_Import_methods); /* mod name, table ptr */ + (void)PartDesignGui::initModule(); Base::Console().Log("Loading GUI of PartDesign module... done\n"); // instantiating the commands @@ -101,5 +121,3 @@ void PartDesignGuiExport initPartDesignGui() // add resources and reloads the translators loadPartDesignResource(); } - -} // extern "C" { diff --git a/src/Mod/PartDesign/Gui/AppPartDesignGuiPy.cpp b/src/Mod/PartDesign/Gui/AppPartDesignGuiPy.cpp deleted file mode 100644 index d184ea1e685b..000000000000 --- a/src/Mod/PartDesign/Gui/AppPartDesignGuiPy.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2008 Jürgen Riegel (juergen.riegel@web.de) * - * * - * 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 - - -/* registration table */ -struct PyMethodDef PartDesignGui_Import_methods[] = { - {NULL, NULL} /* end of table marker */ -}; diff --git a/src/Mod/PartDesign/Gui/CMakeLists.txt b/src/Mod/PartDesign/Gui/CMakeLists.txt index ecfec37f0252..45743b3060c8 100644 --- a/src/Mod/PartDesign/Gui/CMakeLists.txt +++ b/src/Mod/PartDesign/Gui/CMakeLists.txt @@ -157,7 +157,6 @@ SOURCE_GROUP("TaskDialogs" FILES ${PartDesignGuiTaskDlgs_SRCS}) SET(PartDesignGuiModule_SRCS AppPartDesignGui.cpp - AppPartDesignGuiPy.cpp Command.cpp Resources/PartDesign.qrc PreCompiled.cpp