diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index d2b897c8cc..e170deee77 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -52,6 +52,7 @@ #include "Mod/Part/App/BSplineCurvePy.h" #include "Mod/Part/App/BSplineSurfacePy.h" #include +#include #include "Mod/Part/App/CirclePy.h" #include "Mod/Part/App/ConePy.h" #include "Mod/Part/App/ConicPy.h" @@ -291,7 +292,6 @@ PyMOD_INIT_FUNC(Part) Base::Interpreter().addType(&Part::GeometryBoolExtensionPy ::Type,partModule,"GeometryBoolExtension"); Base::Interpreter().addType(&Part::GeometryDoubleExtensionPy ::Type,partModule,"GeometryDoubleExtension"); Base::Interpreter().addType(&Part::PrecisionPy ::Type,partModule,"Precision"); - Base::Interpreter().addType(&Part::ChFi2d_FilletAlgoPy::Type,partModule,"ChFi2d_FilletAlgo"); // BRepFeat package PyObject* brepfeatModule(module.getAttr("BRepFeat").ptr()); @@ -339,6 +339,11 @@ PyMOD_INIT_FUNC(Part) PyObject* shapeUpgrade(module.getAttr("ShapeUpgrade").ptr()); Base::Interpreter().addType(&Part::UnifySameDomainPy::Type, shapeUpgrade, "UnifySameDomain"); + // ChFi2d sub-module + PyObject* chFi2d(module.getAttr("ChFi2d").ptr()); + Base::Interpreter().addType(&Part::ChFi2d_FilletAlgoPy::Type, chFi2d, "FilletAlgo"); + Base::Interpreter().addType(&Part::ChFi2d_FilletAPIPy::Type, chFi2d, "FilletAPI"); + Part::TopoShape ::init(); Part::PropertyPartShape ::init(); Part::PropertyGeometryList ::init(); diff --git a/src/Mod/Part/App/AppPartPy.cpp b/src/Mod/Part/App/AppPartPy.cpp index 64dd4f46bf..82686cdd4b 100644 --- a/src/Mod/Part/App/AppPartPy.cpp +++ b/src/Mod/Part/App/AppPartPy.cpp @@ -314,6 +314,17 @@ public: virtual ~ShapeUpgradeModule() {} }; +class ChFi2dModule : public Py::ExtensionModule +{ +public: + ChFi2dModule() : Py::ExtensionModule("ChFi2d") + { + initialize("This is a module working with the ChFi2d framework."); // register with Python + } + + virtual ~ChFi2dModule() {} +}; + class Module : public Py::ExtensionModule { BRepFeatModule brepFeat; @@ -322,6 +333,7 @@ class Module : public Py::ExtensionModule GeomPlateModule geomPlate; HLRBRepModule HLRBRep; ShapeUpgradeModule shapeUpgrade; + ChFi2dModule chFi2d; public: Module() : Py::ExtensionModule("Part") { @@ -548,6 +560,7 @@ public: PyModule_AddObject(m_module, "GeomPlate", geomPlate.module().ptr()); PyModule_AddObject(m_module, "HLRBRep", HLRBRep.module().ptr()); PyModule_AddObject(m_module, "ShapeUpgrade", shapeUpgrade.module().ptr()); + PyModule_AddObject(m_module, "ChFi2d", chFi2d.module().ptr()); } virtual ~Module() {} diff --git a/src/Mod/Part/App/CMakeLists.txt b/src/Mod/Part/App/CMakeLists.txt index 7e5782e6a0..8ca6c32388 100644 --- a/src/Mod/Part/App/CMakeLists.txt +++ b/src/Mod/Part/App/CMakeLists.txt @@ -92,6 +92,7 @@ generate_from_xml(TopoShapeWirePy) generate_from_xml(BRepOffsetAPI_MakePipeShellPy) generate_from_xml(BRepOffsetAPI_MakeFillingPy) generate_from_xml(ChFi2d_FilletAlgoPy) +generate_from_xml(ChFi2d_FilletAPIPy) generate_from_xml(PrecisionPy) # make sure to create the directory at configure time @@ -321,6 +322,8 @@ SET(Python_SRCS BRepOffsetAPI_MakeFillingPyImp.cpp ChFi2d_FilletAlgoPy.xml ChFi2d_FilletAlgoPyImp.cpp + ChFi2d_FilletAPIPy.xml + ChFi2d_FilletAPIPyImp.cpp PrecisionPy.xml PrecisionPyImp.cpp PartPyCXX.cpp diff --git a/src/Mod/Part/App/ChFi2d_FilletAPIPy.xml b/src/Mod/Part/App/ChFi2d_FilletAPIPy.xml new file mode 100644 index 0000000000..38aab49589 --- /dev/null +++ b/src/Mod/Part/App/ChFi2d_FilletAPIPy.xml @@ -0,0 +1,44 @@ + + + + + + Algorithm that creates fillet edge + + + + Initializes a fillet algorithm: accepts a wire consisting of two edges in a plane + + + + + perform(radius) -> bool + +Constructs a fillet edge + + + + + Returns number of possible solutions + + + + + result(point, solution=-1) + +Returns result (fillet edge, modified edge1, modified edge2) + + + + diff --git a/src/Mod/Part/App/ChFi2d_FilletAPIPyImp.cpp b/src/Mod/Part/App/ChFi2d_FilletAPIPyImp.cpp new file mode 100644 index 0000000000..7ae3bca4e9 --- /dev/null +++ b/src/Mod/Part/App/ChFi2d_FilletAPIPyImp.cpp @@ -0,0 +1,188 @@ +/*************************************************************************** + * Copyright (c) 2022 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 +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include "Tools.h" + +using namespace Part; + + +PyObject *ChFi2d_FilletAPIPy::PyMake(struct _typeobject *, PyObject *, PyObject *) // Python wrapper +{ + // create a new instance of ChFi2d_FilletAPIPy and the Twin object + return new ChFi2d_FilletAPIPy(new ChFi2d_FilletAPI); +} + +// constructor method +int ChFi2d_FilletAPIPy::PyInit(PyObject* args, PyObject* /*kwd*/) +{ + if (PyArg_ParseTuple(args, "")) + return 0; + + PyErr_Clear(); + PyObject* wire; + PyObject* plane; + if (PyArg_ParseTuple(args, "O!O!", &TopoShapeWirePy::Type, &wire, &PlanePy::Type, &plane)) { + TopoDS_Shape shape = static_cast(wire)->getTopoShapePtr()->getShape(); + Handle(Geom_Plane) hPlane = Handle(Geom_Plane)::DownCast(static_cast(plane)->getGeomPlanePtr()->handle()); + getChFi2d_FilletAPIPtr()->Init(TopoDS::Wire(shape), hPlane->Pln()); + return 0; + } + + PyErr_Clear(); + PyObject* edge1; + PyObject* edge2; + if (PyArg_ParseTuple(args, "O!O!O!", &TopoShapeEdgePy::Type, &edge1, + &TopoShapeEdgePy::Type, &edge2, + &PlanePy::Type, &plane)) { + TopoDS_Shape shape1 = static_cast(edge1)->getTopoShapePtr()->getShape(); + TopoDS_Shape shape2 = static_cast(edge2)->getTopoShapePtr()->getShape(); + Handle(Geom_Plane) hPlane = Handle(Geom_Plane)::DownCast(static_cast(plane)->getGeomPlanePtr()->handle()); + getChFi2d_FilletAPIPtr()->Init(TopoDS::Edge(shape1), TopoDS::Edge(shape2), hPlane->Pln()); + return 0; + } + + PyErr_SetString(PyExc_TypeError, "Wrong arguments:\n" + "-- FilletAPI()\n" + "-- FilletAPI(wire, plane)" + "-- FilletAPI(edge, edge, plane)\n"); + return -1; +} + +// returns a string which represents the object e.g. when printed in python +std::string ChFi2d_FilletAPIPy::representation() const +{ + return std::string(""); +} + +PyObject* ChFi2d_FilletAPIPy::init(PyObject *args) +{ + PyObject* wire; + PyObject* plane; + if (PyArg_ParseTuple(args, "O!O!", &TopoShapeWirePy::Type, &wire, &PlanePy::Type, &plane)) { + TopoDS_Shape shape = static_cast(wire)->getTopoShapePtr()->getShape(); + Handle(Geom_Plane) hPlane = Handle(Geom_Plane)::DownCast(static_cast(plane)->getGeomPlanePtr()->handle()); + getChFi2d_FilletAPIPtr()->Init(TopoDS::Wire(shape), hPlane->Pln()); + Py_Return; + } + + PyErr_Clear(); + PyObject* edge1; + PyObject* edge2; + if (PyArg_ParseTuple(args, "O!O!O!", &TopoShapeEdgePy::Type, &edge1, + &TopoShapeEdgePy::Type, &edge2, + &PlanePy::Type, &plane)) { + TopoDS_Shape shape1 = static_cast(edge1)->getTopoShapePtr()->getShape(); + TopoDS_Shape shape2 = static_cast(edge2)->getTopoShapePtr()->getShape(); + Handle(Geom_Plane) hPlane = Handle(Geom_Plane)::DownCast(static_cast(plane)->getGeomPlanePtr()->handle()); + getChFi2d_FilletAPIPtr()->Init(TopoDS::Edge(shape1), TopoDS::Edge(shape2), hPlane->Pln()); + Py_Return; + } + + PyErr_SetString(PyExc_TypeError, "Wrong arguments:\n" + "-- init(wire, plane)" + "-- init(edge, edge, plane)\n"); + return nullptr; +} + +PyObject* ChFi2d_FilletAPIPy::perform(PyObject *args) +{ + double radius; + if (!PyArg_ParseTuple(args, "d", &radius)) + return nullptr; + + try { + bool ok = getChFi2d_FilletAPIPtr()->Perform(radius); + return Py::new_reference_to(Py::Boolean(ok)); + } + catch (Standard_Failure& e) { + PyErr_SetString(Base::PyExc_FC_CADKernelError, e.GetMessageString()); + return nullptr; + } +} + +PyObject* ChFi2d_FilletAPIPy::numberOfResults(PyObject *args) +{ + PyObject* pnt; + if (!PyArg_ParseTuple(args, "O!", &Base::VectorPy::Type, &pnt)) + return nullptr; + + try { + Base::Vector3d* vec = static_cast(pnt)->getVectorPtr(); + Standard_Integer num = getChFi2d_FilletAPIPtr()->NbResults(gp_Pnt(vec->x, vec->y, vec->z)); + return Py::new_reference_to(Py::Long(num)); + } + catch (Standard_Failure& e) { + PyErr_SetString(Base::PyExc_FC_CADKernelError, e.GetMessageString()); + return nullptr; + } +} + +PyObject* ChFi2d_FilletAPIPy::result(PyObject *args) +{ + PyObject* pnt; + int solution = -1; + if (!PyArg_ParseTuple(args, "O!|i", &Base::VectorPy::Type, &pnt, &solution)) + return nullptr; + + Base::Vector3d* vec = static_cast(pnt)->getVectorPtr(); + + try { + TopoDS_Edge theEdge1, theEdge2; + TopoDS_Shape res_edge = getChFi2d_FilletAPIPtr()->Result(Base::convertTo(*vec), theEdge1, theEdge2, solution); + + Py::TupleN tuple(Py::asObject(TopoShape(res_edge).getPyObject()), + Py::asObject(TopoShape(theEdge1).getPyObject()), + Py::asObject(TopoShape(theEdge2).getPyObject())); + return Py::new_reference_to(tuple); + } + catch (Standard_Failure& e) { + PyErr_SetString(Base::PyExc_FC_CADKernelError, e.GetMessageString()); + return nullptr; + } +} + +PyObject *ChFi2d_FilletAPIPy::getCustomAttributes(const char* /*attr*/) const +{ + return nullptr; +} + +int ChFi2d_FilletAPIPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) +{ + return 0; +} diff --git a/src/Mod/Part/App/ChFi2d_FilletAlgoPy.xml b/src/Mod/Part/App/ChFi2d_FilletAlgoPy.xml index 864a54b41b..30f8ddf575 100644 --- a/src/Mod/Part/App/ChFi2d_FilletAlgoPy.xml +++ b/src/Mod/Part/App/ChFi2d_FilletAlgoPy.xml @@ -3,7 +3,7 @@ "); + return std::string(""); } PyObject* ChFi2d_FilletAlgoPy::init(PyObject *args) diff --git a/src/Mod/Part/TestPartApp.py b/src/Mod/Part/TestPartApp.py index 22dbbaf365..0e2d07b80a 100644 --- a/src/Mod/Part/TestPartApp.py +++ b/src/Mod/Part/TestPartApp.py @@ -240,9 +240,9 @@ class PartTestFilletAlgo(unittest.TestCase): pln = Part.Plane() with self.assertRaises(TypeError): - alg = Part.ChFi2d_FilletAlgo(pln) + alg = Part.ChFi2d.FilletAlgo(pln) - alg = Part.ChFi2d_FilletAlgo() + alg = Part.ChFi2d.FilletAlgo() with self.assertRaises(TypeError): alg.init() @@ -254,11 +254,11 @@ class PartTestFilletAlgo(unittest.TestCase): with self.assertRaises(TypeError): alg.perform() - alg = Part.ChFi2d_FilletAlgo(wire, pln) + alg = Part.ChFi2d.FilletAlgo(wire, pln) alg.init(edge1, edge2, pln) alg.init(wire, pln) - alg = Part.ChFi2d_FilletAlgo(edge1, edge2, pln) + alg = Part.ChFi2d.FilletAlgo(edge1, edge2, pln) alg.perform(1.0) with self.assertRaises(TypeError):