diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index e045a221cc..e64d463218 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -1121,7 +1121,7 @@ void MeshObject::trim(const Base::Polygon2d& polygon2d, this->_kernel.AddFacets(triangle); } -void MeshObject::trim(const Base::Vector3f& base, const Base::Vector3f& normal) +void MeshObject::trimByPlane(const Base::Vector3f& base, const Base::Vector3f& normal) { MeshCore::MeshTrimByPlane trim(this->_kernel); std::vector trimFacets, removeFacets; diff --git a/src/Mod/Mesh/App/Mesh.h b/src/Mod/Mesh/App/Mesh.h index b2fa4c1fda..6d531802db 100644 --- a/src/Mod/Mesh/App/Mesh.h +++ b/src/Mod/Mesh/App/Mesh.h @@ -240,7 +240,7 @@ public: float fMinEps = 1.0e-2f, bool bConnectPolygons = false) const; void cut(const Base::Polygon2d& polygon, const Base::ViewProjMethod& proj, CutType); void trim(const Base::Polygon2d& polygon, const Base::ViewProjMethod& proj, CutType); - void trim(const Base::Vector3f& base, const Base::Vector3f& normal); + void trimByPlane(const Base::Vector3f& base, const Base::Vector3f& normal); //@} /** @name Selection */ diff --git a/src/Mod/Mesh/App/MeshPy.xml b/src/Mod/Mesh/App/MeshPy.xml index 9cfacb9a84..9c85d17014 100644 --- a/src/Mod/Mesh/App/MeshPy.xml +++ b/src/Mod/Mesh/App/MeshPy.xml @@ -447,7 +447,16 @@ The argument int is the mode: 0=inner, 1=outer - + + + Trims the mesh with a given plane +trimByPlane(Vector, Vector) -> None +The plane is defined by a base and normal vector. Depending on the +direction of the normal the part above or below will be kept. + + + + Adjust wrong oriented facets diff --git a/src/Mod/Mesh/App/MeshPyImp.cpp b/src/Mod/Mesh/App/MeshPyImp.cpp index 30b1277b3c..4f47e92368 100644 --- a/src/Mod/Mesh/App/MeshPyImp.cpp +++ b/src/Mod/Mesh/App/MeshPyImp.cpp @@ -1744,6 +1744,22 @@ PyObject* MeshPy::trim(PyObject *args) Py_Return; } +PyObject* MeshPy::trimByPlane(PyObject *args) +{ + PyObject *base, *norm; + if (!PyArg_ParseTuple(args, "O!O!", &Base::VectorPy::Type, &base, + &Base::VectorPy::Type, &norm)) + return nullptr; + + Base::Vector3d pnt = Py::Vector(base, false).toVector(); + Base::Vector3d dir = Py::Vector(norm, false).toVector(); + + getMeshObjectPtr()->trimByPlane(Base::convertTo(pnt), + Base::convertTo(dir)); + + Py_Return; +} + PyObject* MeshPy::smooth(PyObject *args, PyObject *kwds) { char* method = "Laplace"; diff --git a/src/Mod/MeshPart/Gui/Command.cpp b/src/Mod/MeshPart/Gui/Command.cpp index 38ea426665..22f2ff929e 100644 --- a/src/Mod/MeshPart/Gui/Command.cpp +++ b/src/Mod/MeshPart/Gui/Command.cpp @@ -146,19 +146,19 @@ void CmdMeshPartTrimByPlane::activated(int) Base::Vector3f plnNormal = Base::convertTo(normal); if (role == Gui::SelectionRole::Inner) { - mesh->trim(plnBase, plnNormal); + mesh->trimByPlane(plnBase, plnNormal); static_cast(*it)->Mesh.finishEditing(); } else if (role == Gui::SelectionRole::Outer) { - mesh->trim(plnBase, -plnNormal); + mesh->trimByPlane(plnBase, -plnNormal); static_cast(*it)->Mesh.finishEditing(); } else if (role == Gui::SelectionRole::Split) { Mesh::MeshObject copy(*mesh); - mesh->trim(plnBase, plnNormal); + mesh->trimByPlane(plnBase, plnNormal); static_cast(*it)->Mesh.finishEditing(); - copy.trim(plnBase, -plnNormal); + copy.trimByPlane(plnBase, -plnNormal); App::Document* doc = (*it)->getDocument(); Mesh::Feature* fea = static_cast(doc->addObject("Mesh::Feature")); fea->Label.setValue((*it)->Label.getValue());