From 1309b86ea58c18fa4e67dbd99011f448c02450c1 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 15 Sep 2022 09:52:14 +0200 Subject: [PATCH] App: move from float to double for accuracy parameter, add a virtual method to determine a default accuracy --- src/App/ComplexGeoData.cpp | 11 ++++++++--- src/App/ComplexGeoData.h | 10 ++++++---- src/Mod/Inspection/App/InspectionFeature.cpp | 12 +++--------- src/Mod/Inspection/Gui/ViewProviderInspection.cpp | 9 ++------- src/Mod/Mesh/App/Mesh.cpp | 8 ++++---- src/Mod/Mesh/App/Mesh.h | 4 ++-- src/Mod/Mesh/App/MeshPyImp.cpp | 2 +- src/Mod/Part/App/TopoShape.cpp | 13 ++++++++++--- src/Mod/Part/App/TopoShape.h | 8 +++++--- src/Mod/Part/App/TopoShapePyImp.cpp | 4 ++-- src/Mod/Points/App/Points.cpp | 2 +- src/Mod/Points/App/Points.h | 2 +- .../ReverseEngineering/Gui/FitBSplineSurface.cpp | 2 +- 13 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/App/ComplexGeoData.cpp b/src/App/ComplexGeoData.cpp index 151216727a..253a686be7 100644 --- a/src/App/ComplexGeoData.cpp +++ b/src/App/ComplexGeoData.cpp @@ -100,6 +100,11 @@ Base::Placement ComplexGeoData::getPlacement() const Base::Rotation(mat)); } +double ComplexGeoData::getAccuracy() const +{ + return 0.0; +} + void ComplexGeoData::getLinesFromSubElement(const Segment*, std::vector &Points, std::vector &lines) const @@ -128,7 +133,7 @@ Base::Vector3d ComplexGeoData::getPointFromLineIntersection(const Base::Vector3f void ComplexGeoData::getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t flags) const + double Accuracy, uint16_t flags) const { (void)Points; (void)Normals; @@ -138,7 +143,7 @@ void ComplexGeoData::getPoints(std::vector &Points, void ComplexGeoData::getLines(std::vector &Points, std::vector &lines, - float Accuracy, uint16_t flags) const + double Accuracy, uint16_t flags) const { (void)Points; (void)lines; @@ -148,7 +153,7 @@ void ComplexGeoData::getLines(std::vector &Points, void ComplexGeoData::getFaces(std::vector &Points, std::vector &faces, - float Accuracy, uint16_t flags) const + double Accuracy, uint16_t flags) const { (void)Points; (void)faces; diff --git a/src/App/ComplexGeoData.h b/src/App/ComplexGeoData.h index e6af43a569..8bbee9c971 100644 --- a/src/App/ComplexGeoData.h +++ b/src/App/ComplexGeoData.h @@ -139,8 +139,10 @@ public: /** @name Getting basic geometric entities */ //@{ + /// Get the standard accuracy to be used with getPoints, getLines or getFaces + virtual double getAccuracy() const; /// Get the bound box - virtual Base::BoundBox3d getBoundBox()const=0; + virtual Base::BoundBox3d getBoundBox() const=0; /** Get point from line object intersection */ virtual Base::Vector3d getPointFromLineIntersection( const Base::Vector3f& base, @@ -148,13 +150,13 @@ public: /** Get points from object with given accuracy */ virtual void getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t flags=0) const; + double Accuracy, uint16_t flags=0) const; /** Get lines from object with given accuracy */ virtual void getLines(std::vector &Points,std::vector &lines, - float Accuracy, uint16_t flags=0) const; + double Accuracy, uint16_t flags=0) const; /** Get faces from object with given accuracy */ virtual void getFaces(std::vector &Points,std::vector &faces, - float Accuracy, uint16_t flags=0) const; + double Accuracy, uint16_t flags=0) const; /** Get the center of gravity * If this method is implemented then true is returned and the center of gravity. * The default implementation only returns false. diff --git a/src/Mod/Inspection/App/InspectionFeature.cpp b/src/Mod/Inspection/App/InspectionFeature.cpp index 05ed5b46dc..8acfa1f2a4 100644 --- a/src/Mod/Inspection/App/InspectionFeature.cpp +++ b/src/Mod/Inspection/App/InspectionFeature.cpp @@ -106,13 +106,7 @@ Base::Vector3f InspectActualPoints::getPoint(unsigned long index) const InspectActualShape::InspectActualShape(const Part::TopoShape& shape) : _rShape(shape) { - ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath - ("User parameter:BaseApp/Preferences/Mod/Part"); - float deviation = hGrp->GetFloat("MeshDeviation",0.2); - - Base::BoundBox3d bbox = _rShape.getBoundBox(); - Standard_Real deflection = (bbox.LengthX() + bbox.LengthY() + bbox.LengthZ())/300.0 * deviation; - + Standard_Real deflection = _rShape.getAccuracy(); fetchPoints(deflection); } @@ -123,13 +117,13 @@ void InspectActualShape::fetchPoints(double deflection) TopExp::MapShapes(_rShape.getShape(), TopAbs_FACE, mapOfShapes); if (!mapOfShapes.IsEmpty()) { std::vector f; - _rShape.getFaces(points, f, static_cast(deflection)); + _rShape.getFaces(points, f, deflection); } else { TopExp::MapShapes(_rShape.getShape(), TopAbs_EDGE, mapOfShapes); if (!mapOfShapes.IsEmpty()) { std::vector n; - _rShape.getPoints(points, n, static_cast(deflection)); + _rShape.getPoints(points, n, deflection); } } } diff --git a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp index 8c44b25d3d..0ed7208875 100644 --- a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp +++ b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp @@ -188,7 +188,7 @@ void ViewProviderInspection::updateData(const App::Property* prop) if (prop->getTypeId().isDerivedFrom(App::PropertyLink::getClassTypeId())) { App::GeoFeature* object = static_cast(prop)->getValue(); if (object) { - float accuracy=0; + double accuracy = 0.0; Base::Type meshId = Base::Type::fromName("Mesh::Feature"); Base::Type shapeId = Base::Type::fromName("Part::Feature"); Base::Type pointId = Base::Type::fromName("Points::Feature"); @@ -211,12 +211,7 @@ void ViewProviderInspection::updateData(const App::Property* prop) App::Property* propS = object->getPropertyByName("Shape"); if (propS && propS->getTypeId().isDerivedFrom(propId)) { const Data::ComplexGeoData* data = static_cast(propS)->getComplexData(); - ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath - ("User parameter:BaseApp/Preferences/Mod/Part"); - float deviation = hGrp->GetFloat("MeshDeviation",0.2); - - Base::BoundBox3d bbox = data->getBoundBox(); - accuracy = (float)((bbox.LengthX() + bbox.LengthY() + bbox.LengthZ())/300.0 * deviation); + accuracy = data->getAccuracy(); data->getFaces(points, faces, accuracy); if (points.empty()) { std::vector normals_d; diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index 8b47ea49aa..8fc00871a4 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -140,10 +140,10 @@ void MeshObject::getFacesFromSubElement(const Data::Segment* element, const MeshSegment* segm = static_cast(element); if (segm->segment) { Base::Reference submesh(segm->mesh->meshFromSegment(segm->segment->getIndices())); - submesh->getFaces(points, faces, 0.0f); + submesh->getFaces(points, faces, 0.0); } else { - segm->mesh->getFaces(points, faces, 0.0f); + segm->mesh->getFaces(points, faces, 0.0); } } } @@ -309,7 +309,7 @@ MeshPoint MeshObject::getMeshPoint(PointIndex index) const void MeshObject::getPoints(std::vector &Points, std::vector &Normals, - float /*Accuracy*/, uint16_t /*flags*/) const + double /*Accuracy*/, uint16_t /*flags*/) const { Points = transformPointsToOutside(_kernel.GetPoints()); MeshCore::MeshRefNormalToPoints ptNormals(_kernel); @@ -323,7 +323,7 @@ Mesh::Facet MeshObject::getMeshFacet(FacetIndex index) const } void MeshObject::getFaces(std::vector &Points,std::vector &Topo, - float /*Accuracy*/, uint16_t /*flags*/) const + double /*Accuracy*/, uint16_t /*flags*/) const { unsigned long ctpoints = _kernel.CountPoints(); Points.reserve(ctpoints); diff --git a/src/Mod/Mesh/App/Mesh.h b/src/Mod/Mesh/App/Mesh.h index 38f30fe6b4..14328a0da5 100644 --- a/src/Mod/Mesh/App/Mesh.h +++ b/src/Mod/Mesh/App/Mesh.h @@ -150,9 +150,9 @@ public: /** Get points from object with given accuracy */ void getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; void getFaces(std::vector &Points,std::vector &Topo, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; std::vector getPointsFromFacets(const std::vector& facets) const; bool nearestFacetOnRay(const TRay& ray, double maxAngle, TFaceSection& output) const; std::vector foraminate(const TRay& ray, double maxAngle) const; diff --git a/src/Mod/Mesh/App/MeshPyImp.cpp b/src/Mod/Mesh/App/MeshPyImp.cpp index cc62c3d08b..7a5b65fd63 100644 --- a/src/Mod/Mesh/App/MeshPyImp.cpp +++ b/src/Mod/Mesh/App/MeshPyImp.cpp @@ -2050,7 +2050,7 @@ Py::Tuple MeshPy::getTopology() const { std::vector Points; std::vector Facets; - getMeshObjectPtr()->getFaces(Points, Facets, 0.0f); + getMeshObjectPtr()->getFaces(Points, Facets, 0.0); Py::Tuple tuple(2); Py::List vertex; for (std::vector::const_iterator it = Points.begin(); diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index 4cd441e7bd..72f8807583 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -3487,9 +3487,16 @@ void TopoShape::getFacesFromDomains(const std::vector& domains, points.swap(meshPoints); } +double TopoShape::getAccuracy() const +{ + double deviation = 0.2; + Base::BoundBox3d bbox = getBoundBox(); + return ((bbox.LengthX() + bbox.LengthY() + bbox.LengthZ())/300.0 * deviation); +} + void TopoShape::getFaces(std::vector &aPoints, std::vector &aTopo, - float accuracy, uint16_t /*flags*/) const + double accuracy, uint16_t /*flags*/) const { if (this->_Shape.IsNull()) return; @@ -3679,14 +3686,14 @@ void TopoShape::getLinesFromSubShape(const TopoDS_Shape& shape, void TopoShape::getLines(std::vector &vertices, std::vector &lines, - float /*Accuracy*/, uint16_t /*flags*/) const + double /*Accuracy*/, uint16_t /*flags*/) const { getLinesFromSubShape(_Shape, vertices, lines); } void TopoShape::getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t /*flags*/) const + double Accuracy, uint16_t /*flags*/) const { if (_Shape.IsNull()) return; diff --git a/src/Mod/Part/App/TopoShape.h b/src/Mod/Part/App/TopoShape.h index a24558b421..310ead5a85 100644 --- a/src/Mod/Part/App/TopoShape.h +++ b/src/Mod/Part/App/TopoShape.h @@ -136,15 +136,17 @@ private: void getFacesFromDomains(const std::vector& domains, std::vector& vertices, std::vector& faces) const; public: + /// Get the standard accuracy to be used with getPoints, getLines or getFaces + double getAccuracy() const override; /** Get points from object with given accuracy */ void getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; /** Get lines from object with given accuracy */ void getLines(std::vector &Points,std::vector &lines, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; void getFaces(std::vector &Points,std::vector &faces, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; void setFaces(const std::vector &Points, const std::vector &faces, double tolerance=1.0e-06); void getDomains(std::vector&) const; diff --git a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp index 4cd37fea42..8c439b1934 100644 --- a/src/Mod/Part/App/TopoShapePyImp.cpp +++ b/src/Mod/Part/App/TopoShapePyImp.cpp @@ -1931,9 +1931,9 @@ PyObject* TopoShapePy::hashCode(PyObject *args) PyObject* TopoShapePy::tessellate(PyObject *args) { - float tolerance; + double tolerance; PyObject* ok = Py_False; - if (!PyArg_ParseTuple(args, "f|O!",&tolerance,&PyBool_Type,&ok)) + if (!PyArg_ParseTuple(args, "d|O!", &tolerance, &PyBool_Type, &ok)) return nullptr; try { diff --git a/src/Mod/Points/App/Points.cpp b/src/Mod/Points/App/Points.cpp index c51ad773b4..e8831f5f3b 100644 --- a/src/Mod/Points/App/Points.cpp +++ b/src/Mod/Points/App/Points.cpp @@ -235,7 +235,7 @@ void PointKernel::save(std::ostream& out) const void PointKernel::getPoints(std::vector &Points, std::vector &/*Normals*/, - float /*Accuracy*/, uint16_t /*flags*/) const + double /*Accuracy*/, uint16_t /*flags*/) const { unsigned long ctpoints = _Points.size(); Points.reserve(ctpoints); diff --git a/src/Mod/Points/App/Points.h b/src/Mod/Points/App/Points.h index 49c529ba5f..14d5aafd3c 100644 --- a/src/Mod/Points/App/Points.h +++ b/src/Mod/Points/App/Points.h @@ -92,7 +92,7 @@ public: void getPoints(std::vector &Points, std::vector &Normals, - float Accuracy, uint16_t flags=0) const override; + double Accuracy, uint16_t flags=0) const override; void transformGeometry(const Base::Matrix4D &rclMat) override; Base::BoundBox3d getBoundBox()const override; diff --git a/src/Mod/ReverseEngineering/Gui/FitBSplineSurface.cpp b/src/Mod/ReverseEngineering/Gui/FitBSplineSurface.cpp index fa92876fba..da508fd0de 100644 --- a/src/Mod/ReverseEngineering/Gui/FitBSplineSurface.cpp +++ b/src/Mod/ReverseEngineering/Gui/FitBSplineSurface.cpp @@ -120,7 +120,7 @@ void FitBSplineSurfaceWidget::on_makePlacement_clicked() const App::PropertyComplexGeoData* geom = geo->getPropertyOfGeometry(); if (geom) { std::vector points, normals; - geom->getComplexData()->getPoints(points, normals, 0.001f); + geom->getComplexData()->getPoints(points, normals, 0.001); std::vector data; std::transform(points.begin(), points.end(), std::back_inserter(data), [](const Base::Vector3d& v) {