From b3cd06afe86c8d9b395c51788e6733439ccce18b Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 13 Dec 2020 16:30:04 +0100 Subject: [PATCH 1/4] Py: fix memory leaks by incorrect use of PyList_Append --- src/Mod/Part/App/AppPartPy.cpp | 25 ++-- src/Mod/Part/App/FT2FC.cpp | 136 +++++++++--------- src/Mod/Part/App/TopoShapePyImp.cpp | 44 +++--- src/Mod/Path/App/AppPathPy.cpp | 30 ++-- src/Mod/Path/App/ToolPyImp.cpp | 14 +- src/Mod/TechDraw/App/AppTechDrawPy.cpp | 11 +- src/Mod/TechDraw/App/CenterLinePyImp.cpp | 18 +-- src/Mod/TechDraw/App/DrawPagePyImp.cpp | 12 +- src/Mod/TechDraw/App/DrawViewClipPyImp.cpp | 15 +- .../TechDraw/App/DrawViewDimensionPyImp.cpp | 42 +++--- src/Mod/TechDraw/App/DrawViewPartPyImp.cpp | 12 +- 11 files changed, 174 insertions(+), 185 deletions(-) diff --git a/src/Mod/Part/App/AppPartPy.cpp b/src/Mod/Part/App/AppPartPy.cpp index 75b7f71462..5d206bf3cc 100644 --- a/src/Mod/Part/App/AppPartPy.cpp +++ b/src/Mod/Part/App/AppPartPy.cpp @@ -793,21 +793,20 @@ private: Py::Object getFacets(const Py::Tuple& args) { PyObject *shape; - PyObject *list = PyList_New(0); + Py::List list; if (!PyArg_ParseTuple(args.ptr(), "O", &shape)) throw Py::Exception(); auto theShape = static_cast(shape)->getTopoShapePtr()->getShape(); - for(TopExp_Explorer ex(theShape, TopAbs_FACE); ex.More(); ex.Next()) - { + for (TopExp_Explorer ex(theShape, TopAbs_FACE); ex.More(); ex.Next()) { TopoDS_Face currentFace = TopoDS::Face(ex.Current()); TopLoc_Location loc; Handle(Poly_Triangulation) facets = BRep_Tool::Triangulation(currentFace, loc); const TopAbs_Orientation anOrientation = currentFace.Orientation(); bool flip = (anOrientation == TopAbs_REVERSED); - if(!facets.IsNull()){ + if (!facets.IsNull()) { const TColgp_Array1OfPnt& nodes = facets->Nodes(); const Poly_Array1OfTriangle& triangles = facets->Triangles(); - for(int i = 1; i <= triangles.Length(); i++){ + for (int i = 1; i <= triangles.Length(); i++) { Standard_Integer n1,n2,n3; triangles(i).Get(n1, n2, n3); gp_Pnt p1 = nodes(n1); @@ -821,19 +820,17 @@ private: PyObject *t1 = PyTuple_Pack(3, PyFloat_FromDouble(p1.X()), PyFloat_FromDouble(p1.Y()), PyFloat_FromDouble(p1.Z())); PyObject *t2 = PyTuple_Pack(3, PyFloat_FromDouble(p2.X()), PyFloat_FromDouble(p2.Y()), PyFloat_FromDouble(p2.Z())); PyObject *t3 = PyTuple_Pack(3, PyFloat_FromDouble(p3.X()), PyFloat_FromDouble(p3.Y()), PyFloat_FromDouble(p3.Z())); - PyObject *points; - if(flip) - { - points = PyTuple_Pack(3, t2, t1, t3); - } else { - points = PyTuple_Pack(3, t1, t2, t3); + if (flip) { + list.append(Py::asObject(PyTuple_Pack(3, t2, t1, t3))); + } + else { + list.append(Py::asObject(PyTuple_Pack(3, t1, t2, t3))); } - PyList_Append(list, points); } } } - } - return Py::asObject(list); + } + return list; } Py::Object makeCompound(const Py::Tuple& args) { diff --git a/src/Mod/Part/App/FT2FC.cpp b/src/Mod/Part/App/FT2FC.cpp index 7e7761bfdf..379a58c90f 100644 --- a/src/Mod/Part/App/FT2FC.cpp +++ b/src/Mod/Part/App/FT2FC.cpp @@ -105,30 +105,31 @@ PyObject* FT2FC(const Py_UNICODE *PyUString, const size_t length, const char *FontSpec, const double stringheight, // fc coords - const double tracking) { // fc coords - FT_Library FTLib; - FT_Face FTFont; - FT_Error error; - FT_Long FaceIndex = 0; // some fonts have multiple faces - FT_Vector kern; - FT_UInt FTLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP; + const double tracking) // fc coords +{ + FT_Library FTLib; + FT_Face FTFont; + FT_Error error; + FT_Long FaceIndex = 0; // some fonts have multiple faces + FT_Vector kern; + FT_UInt FTLoadFlags = FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP; - std::stringstream ErrorMsg; - double PenPos = 0, scalefactor; - UNICHAR prevchar = 0, currchar = 0; - int cadv; - size_t i; - PyObject *WireList, *CharList; + std::stringstream ErrorMsg; + double PenPos = 0, scalefactor; + UNICHAR prevchar = 0, currchar = 0; + int cadv; + size_t i; + Py::List CharList; - error = FT_Init_FreeType(&FTLib); - if(error) { - ErrorMsg << "FT_Init_FreeType failed: " << error; - throw std::runtime_error(ErrorMsg.str()); - } + error = FT_Init_FreeType(&FTLib); + if (error) { + ErrorMsg << "FT_Init_FreeType failed: " << error; + throw std::runtime_error(ErrorMsg.str()); + } #ifdef FC_OS_WIN32 Base::FileInfo fi(FontSpec); - if (!fi.isReadable()) { + if (!fi.isReadable()) { ErrorMsg << "Font file not found (Win): " << FontSpec; throw std::runtime_error(ErrorMsg.str()); } @@ -143,58 +144,61 @@ PyObject* FT2FC(const Py_UNICODE *PyUString, #endif - error = FT_New_Face(FTLib,FontSpec,FaceIndex, &FTFont); - if(error) { - ErrorMsg << "FT_New_Face failed: " << error; - throw std::runtime_error(ErrorMsg.str()); - } + error = FT_New_Face(FTLib,FontSpec,FaceIndex, &FTFont); + if (error) { + ErrorMsg << "FT_New_Face failed: " << error; + throw std::runtime_error(ErrorMsg.str()); + } //TODO: check that FTFont is scalable? only relevant for hinting etc? // FT2 blows up if char size is not set to some non-zero value. // This sets size to 48 point. Magic. - error = FT_Set_Char_Size(FTFont, - 0, /* char_width in 1/64th of points */ - 48*64, /* char_height in 1/64th of points */ - 0, /* horizontal device resolution */ - 0 ); /* vertical device resolution */ - if(error) { - ErrorMsg << "FT_Set_Char_Size failed: " << error; - throw std::runtime_error(ErrorMsg.str()); - } + error = FT_Set_Char_Size(FTFont, + 0, /* char_width in 1/64th of points */ + 48*64, /* char_height in 1/64th of points */ + 0, /* horizontal device resolution */ + 0 ); /* vertical device resolution */ + if (error) { + ErrorMsg << "FT_Set_Char_Size failed: " << error; + throw std::runtime_error(ErrorMsg.str()); + } - CharList = PyList_New(0); - scalefactor = stringheight/float(FTFont->height); - for (i=0; iheight); + for (i=0; iglyph->advance.x; - kern = getKerning(FTFont,prevchar,currchar); - PenPos += kern.x; - WireList = getGlyphContours(FTFont,currchar,PenPos, scalefactor,i,tracking); - if (!PyList_Size(WireList)) // empty ==> whitespace - Base::Console().Log("FT2FC char '0x%04x'/'%d' has no Wires!\n", currchar, currchar); - else - PyList_Append(CharList, WireList); - PenPos += cadv; - prevchar = currchar; - } + cadv = FTFont->glyph->advance.x; + kern = getKerning(FTFont,prevchar,currchar); + PenPos += kern.x; + try { + Py::List WireList(getGlyphContours(FTFont, currchar, PenPos, scalefactor, i, tracking), true); + CharList.append(WireList); + } + catch (Py::Exception& e) { + e.clear(); + Base::Console().Log("FT2FC char '0x%04x'/'%d' has no Wires!\n", currchar, currchar); + } - error = FT_Done_FreeType(FTLib); - if(error) { - ErrorMsg << "FT_Done_FreeType failed: " << error; - throw std::runtime_error(ErrorMsg.str()); - } + PenPos += cadv; + prevchar = currchar; + } - return(CharList); - } + error = FT_Done_FreeType(FTLib); + if (error) { + ErrorMsg << "FT_Done_FreeType failed: " << error; + throw std::runtime_error(ErrorMsg.str()); + } + + return Py::new_reference_to(CharList); +} //********** FT Decompose callbacks and data defns // FT Decomp Context for 1 char @@ -342,7 +346,7 @@ PyObject* getGlyphContours(FT_Face FTFont, UNICHAR currchar, double PenPos, doub isTTF = true; } - PyObject* ret = PyList_New(0); + Py::List list; gp_Vec pointer = gp_Vec(PenPos * Scale + charNum*tracking,0.0,0.0); gp_Trsf xForm; @@ -372,9 +376,11 @@ PyObject* getGlyphContours(FT_Face FTFont, UNICHAR currchar, double PenPos, doub ErrorMsg << "FT2FC OCC BRepScale failed \n"; throw std::runtime_error(ErrorMsg.str()); } - PyList_Append(ret,new TopoShapeWirePy(new TopoShape(TopoDS::Wire(BRepScale.Shape())))); + + PyObject* wire = new TopoShapeWirePy(new TopoShape(TopoDS::Wire(BRepScale.Shape()))); + list.append(Py::asObject(wire)); } - return(ret); + return Py::new_reference_to(list); } // get kerning values for this char pair diff --git a/src/Mod/Part/App/TopoShapePyImp.cpp b/src/Mod/Part/App/TopoShapePyImp.cpp index 8d40f2577b..4d5f69718b 100644 --- a/src/Mod/Part/App/TopoShapePyImp.cpp +++ b/src/Mod/Part/App/TopoShapePyImp.cpp @@ -2524,16 +2524,16 @@ PyObject* TopoShapePy::proximity(PyObject *args) PyObject* ps2; Standard_Real tol = Precision::Confusion(); if (!PyArg_ParseTuple(args, "O!|d",&(TopoShapePy::Type), &ps2, &tol)) - return 0; + return nullptr; const TopoDS_Shape& s1 = getTopoShapePtr()->getShape(); const TopoDS_Shape& s2 = static_cast(ps2)->getTopoShapePtr()->getShape(); if (s1.IsNull()) { PyErr_SetString(PyExc_ValueError, "proximity: Shape object is invalid"); - return 0; + return nullptr; } if (s2.IsNull()) { PyErr_SetString(PyExc_ValueError, "proximity: Shape parameter is invalid"); - return 0; + return nullptr; } BRepExtrema_ShapeProximity proximity; @@ -2551,7 +2551,7 @@ PyObject* TopoShapePy::proximity(PyObject *args) BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc); if (aTriangulation.IsNull()) { PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return 0; + return nullptr; } } @@ -2561,7 +2561,7 @@ PyObject* TopoShapePy::proximity(PyObject *args) BRep_Tool::Triangulation(TopoDS::Face(xp.Current()), aLoc); if (aTriangulation.IsNull()) { PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return 0; + return nullptr; } } @@ -2572,7 +2572,7 @@ PyObject* TopoShapePy::proximity(PyObject *args) BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc); if (aPoly3D.IsNull()) { PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return 0; + return nullptr; } } @@ -2582,37 +2582,29 @@ PyObject* TopoShapePy::proximity(PyObject *args) BRep_Tool::Polygon3D(TopoDS::Edge(xp.Current()), aLoc); if (aPoly3D.IsNull()) { PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done, call 'tessellate' beforehand"); - return 0; + return nullptr; } } // another problem must have occurred PyErr_SetString(PartExceptionOCCError, "BRepExtrema_ShapeProximity not done"); - return 0; + return nullptr; } - //PyObject* overlappss1 = PyList_New(0); - //PyObject* overlappss2 = PyList_New(0); - PyObject* overlappssindex1 = PyList_New(0); - PyObject* overlappssindex2 = PyList_New(0); + + Py::List overlappssindex1; + Py::List overlappssindex2; for (BRepExtrema_OverlappedSubShapes::Iterator anIt1 (proximity.OverlapSubShapes1()); anIt1.More(); anIt1.Next()) { - //PyList_Append(overlappss1, new TopoShapeFacePy(new TopoShape(proximity.GetSubShape1 (anIt1.Key())))); -#if PY_MAJOR_VERSION >= 3 - PyList_Append(overlappssindex1,PyLong_FromLong(anIt1.Key()+1)); -#else - PyList_Append(overlappssindex1,PyInt_FromLong(anIt1.Key()+1)); -#endif + overlappssindex1.append(Py::Long(anIt1.Key() + 1)); } for (BRepExtrema_OverlappedSubShapes::Iterator anIt2 (proximity.OverlapSubShapes2()); anIt2.More(); anIt2.Next()) { - //PyList_Append(overlappss2, new TopoShapeFacePy(new TopoShape(proximity.GetSubShape2 (anIt2.Key())))); -#if PY_MAJOR_VERSION >= 3 - PyList_Append(overlappssindex2,PyLong_FromLong(anIt2.Key()+1)); -#else - PyList_Append(overlappssindex2,PyInt_FromLong(anIt2.Key()+1)); -#endif + overlappssindex2.append(Py::Long(anIt2.Key() + 1)); } - //return Py_BuildValue("OO", overlappss1, overlappss2); //subshapes - return Py_BuildValue("OO", overlappssindex1, overlappssindex2); //face indexes + + Py::Tuple tuple(2); + tuple.setItem(0, overlappssindex1); + tuple.setItem(1, overlappssindex2); + return Py::new_reference_to(tuple); //face indexes #else (void)args; PyErr_SetString(PyExc_NotImplementedError, "proximity requires OCCT >= 6.8.1"); diff --git a/src/Mod/Path/App/AppPathPy.cpp b/src/Mod/Path/App/AppPathPy.cpp index a003f09be6..6e0c72d2f5 100644 --- a/src/Mod/Path/App/AppPathPy.cpp +++ b/src/Mod/Path/App/AppPathPy.cpp @@ -389,8 +389,9 @@ private: throw Py::Exception(); std::list shapes; - if (PyObject_TypeCheck(pShapes, &(Part::TopoShapePy::Type))) + if (PyObject_TypeCheck(pShapes, &(Part::TopoShapePy::Type))) { shapes.push_back(static_cast(pShapes)->getTopoShapePtr()->getShape()); + } else if (PyObject_TypeCheck(pShapes, &(PyList_Type)) || PyObject_TypeCheck(pShapes, &(PyTuple_Type))) { Py::Sequence shapeSeq(pShapes); @@ -414,21 +415,18 @@ private: bool need_arc_plane = arc_plane==Area::ArcPlaneAuto; std::list wires = Area::sortWires(shapes,start!=0,&pstart, &pend, 0, &arc_plane, PARAM_PY_FIELDS(PARAM_FARG,AREA_PARAMS_SORT)); - PyObject *list = PyList_New(0); - for(auto &wire : wires) - PyList_Append(list,Py::new_reference_to( - Part::shape2pyshape(TopoDS::Wire(wire)))); - PyObject *ret = PyTuple_New(need_arc_plane?3:2); - PyTuple_SetItem(ret,0,list); - PyTuple_SetItem(ret,1,new Base::VectorPy( - Base::Vector3d(pend.X(),pend.Y(),pend.Z()))); - if(need_arc_plane) -#if PY_MAJOR_VERSION < 3 - PyTuple_SetItem(ret,2,PyInt_FromLong(arc_plane)); -#else - PyTuple_SetItem(ret,2,PyLong_FromLong(arc_plane)); -#endif - return Py::asObject(ret); + Py::List list; + for(auto &wire : wires) { + list.append(Part::shape2pyshape(TopoDS::Wire(wire))); + } + + Py::Tuple ret(need_arc_plane ? 3 : 2); + ret.setItem(0, list); + ret.setItem(1, Py::asObject(new Base::VectorPy(Base::Vector3d(pend.X(),pend.Y(),pend.Z())))); + if (need_arc_plane) + ret.setItem(2, Py::Long(arc_plane)); + + return ret; } PATH_CATCH } }; diff --git a/src/Mod/Path/App/ToolPyImp.cpp b/src/Mod/Path/App/ToolPyImp.cpp index 771449a8eb..91d42245cb 100644 --- a/src/Mod/Path/App/ToolPyImp.cpp +++ b/src/Mod/Path/App/ToolPyImp.cpp @@ -277,12 +277,12 @@ PyObject* ToolPy::getToolTypes(PyObject * args) { if (PyArg_ParseTuple(args, "")) { std::vector toolTypes = Tool::ToolTypes(); - PyObject *list = PyList_New(0); + Py::List list; for(unsigned i = 0; i != toolTypes.size(); i++) { - PyList_Append(list, PYSTRING_FROMSTRING(toolTypes[i].c_str())); + list.append(Py::asObject(PYSTRING_FROMSTRING(toolTypes[i].c_str()))); } - return list; + return Py::new_reference_to(list); } throw Py::TypeError("This method accepts no argument"); } @@ -291,12 +291,12 @@ PyObject* ToolPy::getToolMaterials(PyObject * args) { if (PyArg_ParseTuple(args, "")) { std::vector toolMaterials = Tool::ToolMaterials(); - PyObject *list = PyList_New(0); + Py::List list;; for(unsigned i = 0; i != toolMaterials.size(); i++) { - PyList_Append(list, PYSTRING_FROMSTRING(toolMaterials[i].c_str())); + list.append(Py::asObject(PYSTRING_FROMSTRING(toolMaterials[i].c_str()))); } - return list; + return Py::new_reference_to(list); } throw Py::TypeError("This method accepts no argument"); -} \ No newline at end of file +} diff --git a/src/Mod/TechDraw/App/AppTechDrawPy.cpp b/src/Mod/TechDraw/App/AppTechDrawPy.cpp index 6cfecbf6bb..7afe7011f9 100644 --- a/src/Mod/TechDraw/App/AppTechDrawPy.cpp +++ b/src/Mod/TechDraw/App/AppTechDrawPy.cpp @@ -197,7 +197,8 @@ private: } else { biggie = false; } - PyObject* result = PyList_New(0); + + Py::List result; try { EdgeWalker ew; @@ -207,16 +208,18 @@ private: std::vector rw = ew.getResultNoDups(); std::vector sortedWires = ew.sortStrip(rw,biggie); //false==>do not include biggest wires for (auto& w:sortedWires) { - PyList_Append(result,new TopoShapeWirePy(new TopoShape(w))); + PyObject* wire = new TopoShapeWirePy(new TopoShape(w)); + result.append(Py::asObject(wire)); } - } else { + } + else { Base::Console().Warning("edgeWalker: input is not planar graph. Wire detection not done\n"); } } catch (Base::Exception &e) { throw Py::Exception(Base::BaseExceptionFreeCADError, e.what()); } - return Py::asObject(result); + return result; } Py::Object findOuterWire(const Py::Tuple& args) diff --git a/src/Mod/TechDraw/App/CenterLinePyImp.cpp b/src/Mod/TechDraw/App/CenterLinePyImp.cpp index 1e1c933e1a..570aec4fa9 100644 --- a/src/Mod/TechDraw/App/CenterLinePyImp.cpp +++ b/src/Mod/TechDraw/App/CenterLinePyImp.cpp @@ -300,13 +300,13 @@ Py::Object CenterLinePy::getEdges(void) const std::vector edges = cl->m_edges; int size = edges.size(); - PyObject* result = PyList_New(size); + Py::List result(size); for (auto& e: edges) { - PyList_Append(result, PyUnicode_FromString(e.c_str())); + result.append(Py::asObject(PyUnicode_FromString(e.c_str()))); } - return Py::asObject(result); + return result; } void CenterLinePy::setEdges(Py::Object arg) @@ -346,13 +346,13 @@ Py::Object CenterLinePy::getFaces(void) const std::vector faces = cl->m_faces; int size = faces.size(); - PyObject* result = PyList_New(size); + Py::List result(size); for (auto& f: faces) { - PyList_Append(result, PyUnicode_FromString(f.c_str())); + result.append(Py::asObject(PyUnicode_FromString(f.c_str()))); } - return Py::asObject(result); + return result; } void CenterLinePy::setFaces(Py::Object arg) @@ -393,13 +393,13 @@ Py::Object CenterLinePy::getPoints(void) const std::vector points = cl->m_verts; int size = points.size(); - PyObject* result = PyList_New(size); + Py::List result(size); for (auto& p: points) { - PyList_Append(result, PyUnicode_FromString(p.c_str())); + result.append(Py::asObject(PyUnicode_FromString(p.c_str()))); } - return Py::asObject(result); + return result; } void CenterLinePy::setPoints(Py::Object arg) diff --git a/src/Mod/TechDraw/App/DrawPagePyImp.cpp b/src/Mod/TechDraw/App/DrawPagePyImp.cpp index bff965a33d..42607a80d4 100644 --- a/src/Mod/TechDraw/App/DrawPagePyImp.cpp +++ b/src/Mod/TechDraw/App/DrawPagePyImp.cpp @@ -82,23 +82,23 @@ PyObject* DrawPagePy::getAllViews(PyObject* args) DrawPage* page = getDrawPagePtr(); std::vector allViews = page->getAllViews(); - PyObject* ret = PyList_New(0); + Py::List ret; for (auto&v: allViews) { if (v->isDerivedFrom(TechDraw::DrawProjGroupItem::getClassTypeId())) { TechDraw::DrawProjGroupItem* dpgi = static_cast(v); - PyList_Append(ret,new TechDraw::DrawProjGroupItemPy(dpgi)); //is this legit? or need to make new copy of dv? + ret.append(Py::asObject(new TechDraw::DrawProjGroupItemPy(dpgi))); //is this legit? or need to make new copy of dv? } else if (v->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) { TechDraw::DrawViewPart* dvp = static_cast(v); - PyList_Append(ret,new TechDraw::DrawViewPartPy(dvp)); + ret.append(Py::asObject(new TechDraw::DrawViewPartPy(dvp))); } else if (v->isDerivedFrom(TechDraw::DrawViewAnnotation::getClassTypeId())) { TechDraw::DrawViewAnnotation* dva = static_cast(v); - PyList_Append(ret,new TechDraw::DrawViewAnnotationPy(dva)); + ret.append(Py::asObject(new TechDraw::DrawViewAnnotationPy(dva))); } else { TechDraw::DrawView* dv = static_cast(v); - PyList_Append(ret,new TechDraw::DrawViewPy(dv)); + ret.append(Py::asObject(new TechDraw::DrawViewPy(dv))); } } - return ret; + return Py::new_reference_to(ret); } // double getPageWidth() const; diff --git a/src/Mod/TechDraw/App/DrawViewClipPyImp.cpp b/src/Mod/TechDraw/App/DrawViewClipPyImp.cpp index b803bce3be..324bb5b55f 100644 --- a/src/Mod/TechDraw/App/DrawViewClipPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewClipPyImp.cpp @@ -93,27 +93,20 @@ PyObject* DrawViewClipPy::removeView(PyObject* args) PyObject* DrawViewClipPy::getChildViewNames(PyObject* args) { if (!PyArg_ParseTuple(args, "")) - return 0; + return nullptr; DrawViewClip* clip = getDrawViewClipPtr(); std::vector strings = clip->getChildViewNames(); int stringSize = strings.size(); - PyObject* result = PyList_New(stringSize); + Py::List result(stringSize); std::vector::iterator it = strings.begin(); for( ; it != strings.end(); it++) { -#if PY_MAJOR_VERSION < 3 - PyObject* pString = PyString_FromString(it->c_str()); //TODO: unicode & py3 -#else - PyObject* pString = PyUnicode_FromString(it->c_str()); -#endif - //int rc = - static_cast (PyList_Append(result, pString)); + result.append(Py::String(*it)); } -// PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented"); - return result; + return Py::new_reference_to(result); } PyObject *DrawViewClipPy::getCustomAttributes(const char* ) const diff --git a/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp b/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp index 4a6e82fa41..143204a3b3 100644 --- a/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimensionPyImp.cpp @@ -76,10 +76,10 @@ PyObject* DrawViewDimensionPy::getLinearPoints(PyObject* args) (void) args; DrawViewDimension* dvd = getDrawViewDimensionPtr(); pointPair pts = dvd->getLinearPoints(); - PyObject* ret = PyList_New(0); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.first))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.second))); - return ret; + Py::List ret; + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.first)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.second)))); + return Py::new_reference_to(ret); } PyObject* DrawViewDimensionPy::getArcPoints(PyObject* args) @@ -87,14 +87,14 @@ PyObject* DrawViewDimensionPy::getArcPoints(PyObject* args) (void) args; DrawViewDimension* dvd = getDrawViewDimensionPtr(); arcPoints pts = dvd->getArcPoints(); - PyObject* ret = PyList_New(0); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.center))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.onCurve.first))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.onCurve.second))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.arcEnds.first))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.arcEnds.second))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.midArc))); - return ret; + Py::List ret; + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.center)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.onCurve.first)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.onCurve.second)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.arcEnds.first)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.arcEnds.second)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.midArc)))); + return Py::new_reference_to(ret); } PyObject* DrawViewDimensionPy::getAnglePoints(PyObject* args) @@ -102,11 +102,11 @@ PyObject* DrawViewDimensionPy::getAnglePoints(PyObject* args) (void) args; DrawViewDimension* dvd = getDrawViewDimensionPtr(); anglePoints pts = dvd->getAnglePoints(); - PyObject* ret = PyList_New(0); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.ends.first))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.ends.second))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.vertex))); - return ret; + Py::List ret; + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.ends.first)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.ends.second)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.vertex)))); + return Py::new_reference_to(ret); } PyObject* DrawViewDimensionPy::getArrowPositions(PyObject* args) @@ -114,10 +114,10 @@ PyObject* DrawViewDimensionPy::getArrowPositions(PyObject* args) (void) args; DrawViewDimension* dvd = getDrawViewDimensionPtr(); pointPair pts = dvd->getArrowPositions(); - PyObject* ret = PyList_New(0); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.first))); - PyList_Append(ret,new Base::VectorPy(new Base::Vector3d(pts.second))); - return ret; + Py::List ret; + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.first)))); + ret.append(Py::asObject(new Base::VectorPy(new Base::Vector3d(pts.second)))); + return Py::new_reference_to(ret); } PyObject *DrawViewDimensionPy::getCustomAttributes(const char* /*attr*/) const { diff --git a/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp b/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp index 08f25daf24..1a39f3beb6 100644 --- a/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp +++ b/src/Mod/TechDraw/App/DrawViewPartPyImp.cpp @@ -77,32 +77,32 @@ PyObject* DrawViewPartPy::getVisibleEdges(PyObject *args) { (void) args; DrawViewPart* dvp = getDrawViewPartPtr(); - PyObject* pEdgeList = PyList_New(0); + Py::List pEdgeList; std::vector geoms = dvp->getEdgeGeometry(); for (auto& g: geoms) { if (g->hlrVisible) { PyObject* pEdge = new Part::TopoShapeEdgePy(new Part::TopoShape(g->occEdge)); - PyList_Append(pEdgeList, pEdge); + pEdgeList.append(Py::asObject(pEdge)); } } - return pEdgeList; + return Py::new_reference_to(pEdgeList); } PyObject* DrawViewPartPy::getHiddenEdges(PyObject *args) { (void) args; DrawViewPart* dvp = getDrawViewPartPtr(); - PyObject* pEdgeList = PyList_New(0); + Py::List pEdgeList; std::vector geoms = dvp->getEdgeGeometry(); for (auto& g: geoms) { if (!g->hlrVisible) { PyObject* pEdge = new Part::TopoShapeEdgePy(new Part::TopoShape(g->occEdge)); - PyList_Append(pEdgeList, pEdge); + pEdgeList.append(Py::asObject(pEdge)); } } - return pEdgeList; + return Py::new_reference_to(pEdgeList); } PyObject* DrawViewPartPy::requestPaint(PyObject *args) From 64fdf4c799303d6f3d436e128c78535307a86d0d Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 13 Dec 2020 16:44:14 +0100 Subject: [PATCH 2/4] Py: [skip ci] replace PyList_Append with Py::List::append --- src/Base/Interpreter.cpp | 11 ++--------- src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp | 8 +++----- src/Mod/Sketcher/App/GeometryFacadePyImp.cpp | 8 +++----- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/Base/Interpreter.cpp b/src/Base/Interpreter.cpp index b425b5663c..b4642fb89b 100644 --- a/src/Base/Interpreter.cpp +++ b/src/Base/Interpreter.cpp @@ -544,15 +544,8 @@ void InterpreterSingleton::addType(PyTypeObject* Type,PyObject* Module, const ch void InterpreterSingleton::addPythonPath(const char* Path) { PyGILStateLocker locker; - PyObject *list = PySys_GetObject("path"); -#if PY_MAJOR_VERSION >= 3 - PyObject *path = PyUnicode_FromString(Path); -#else - PyObject *path = PyString_FromString(Path); -#endif - PyList_Append(list, path); - Py_DECREF(path); - PySys_SetObject("path", list); + Py::List list(PySys_GetObject("path")); + list.append(Py::String(Path)); } const char* InterpreterSingleton::init(int argc,char *argv[]) diff --git a/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp b/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp index a86bce0e22..13095bec3c 100644 --- a/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp +++ b/src/Mod/Sketcher/App/ExternalGeometryFacadePyImp.cpp @@ -469,7 +469,7 @@ PyObject* ExternalGeometryFacadePy::getExtensions(PyObject *args) try { const std::vector> ext = this->getExternalGeometryFacadePtr()->getExtensions(); - PyObject* list = PyList_New(0); + Py::List list; for (std::size_t i=0; icopyPyObject(); - PyList_Append( list, cpy); - Py_DECREF(cpy); + list.append(Py::asObject(p->copyPyObject())); } catch(Base::NotImplementedError) { // silently ignoring extensions not having a Python object @@ -488,7 +486,7 @@ PyObject* ExternalGeometryFacadePy::getExtensions(PyObject *args) } } - return list; + return Py::new_reference_to(list); } catch(const Base::ValueError& e) { PyErr_SetString(Part::PartExceptionOCCError, e.what()); diff --git a/src/Mod/Sketcher/App/GeometryFacadePyImp.cpp b/src/Mod/Sketcher/App/GeometryFacadePyImp.cpp index 5ddf5885a4..ab00cba9b6 100644 --- a/src/Mod/Sketcher/App/GeometryFacadePyImp.cpp +++ b/src/Mod/Sketcher/App/GeometryFacadePyImp.cpp @@ -447,7 +447,7 @@ PyObject* GeometryFacadePy::getExtensions(PyObject *args) try { const std::vector> ext = this->getGeometryFacadePtr()->getExtensions(); - PyObject* list = PyList_New(0); + Py::List list; for (std::size_t i=0; icopyPyObject(); - PyList_Append( list, cpy); - Py_DECREF(cpy); + list.append(Py::asObject(p->copyPyObject())); } catch(Base::NotImplementedError) { // silently ignoring extensions not having a Python object @@ -466,7 +464,7 @@ PyObject* GeometryFacadePy::getExtensions(PyObject *args) } } - return list; + return Py::new_reference_to(list); } catch(const Base::ValueError& e) { PyErr_SetString(Part::PartExceptionOCCError, e.what()); From 0b5c62ddabf2c9d419d95a3bb1ad8e596df8cf68 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 13 Dec 2020 16:45:06 +0100 Subject: [PATCH 3/4] Py: [skip ci] replace PyList_Append with Py::List::append --- src/Mod/Part/App/GeometryPyImp.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Mod/Part/App/GeometryPyImp.cpp b/src/Mod/Part/App/GeometryPyImp.cpp index 1598408c09..ded486b763 100644 --- a/src/Mod/Part/App/GeometryPyImp.cpp +++ b/src/Mod/Part/App/GeometryPyImp.cpp @@ -412,7 +412,7 @@ PyObject* GeometryPy::getExtensions(PyObject *args) try { const std::vector> ext = this->getGeometryPtr()->getExtensions(); - PyObject* list = PyList_New(0); + Py::List list; for (std::size_t i=0; icopyPyObject(); - PyList_Append( list, cpy); - Py_DECREF(cpy); + list.append(Py::asObject(p->copyPyObject())); } catch(Base::NotImplementedError) { // silently ignoring extensions not having a Python object @@ -433,7 +431,7 @@ PyObject* GeometryPy::getExtensions(PyObject *args) } } - return list; + return Py::new_reference_to(list); } catch(const Base::ValueError& e) { PyErr_SetString(PartExceptionOCCError, e.what()); From fa7bf5e0ffd58485ed993b2d27a5ca5a11dd5a99 Mon Sep 17 00:00:00 2001 From: luz paz Date: Sun, 13 Dec 2020 06:49:38 -0500 Subject: [PATCH 4/4] Mesh: Uniformity fixes [skip ci] * Sort Mesh.qrc * Capital Case .svg files * Rename Tree_Mesh.svg to Mesh_Tree.svg * Make appropriate changes in the source regarding said name changes --- src/Mod/Mesh/Gui/Command.cpp | 10 ++-- src/Mod/Mesh/Gui/Resources/Mesh.qrc | 52 +++++++++---------- .../{mesh_boundary.svg => Mesh_Boundary.svg} | 8 +-- .../icons/{mesh_cut.svg => Mesh_Cut.svg} | 8 +-- .../{mesh_pipette.svg => Mesh_Pipette.svg} | 8 +-- .../icons/{Tree_Mesh.svg => Mesh_Tree.svg} | 8 +-- src/Mod/Mesh/Gui/ViewProvider.cpp | 2 +- 7 files changed, 48 insertions(+), 48 deletions(-) rename src/Mod/Mesh/Gui/Resources/icons/{mesh_boundary.svg => Mesh_Boundary.svg} (97%) rename src/Mod/Mesh/Gui/Resources/icons/{mesh_cut.svg => Mesh_Cut.svg} (99%) rename src/Mod/Mesh/Gui/Resources/icons/{mesh_pipette.svg => Mesh_Pipette.svg} (98%) rename src/Mod/Mesh/Gui/Resources/icons/{Tree_Mesh.svg => Mesh_Tree.svg} (98%) diff --git a/src/Mod/Mesh/Gui/Command.cpp b/src/Mod/Mesh/Gui/Command.cpp index cbeb0596cb..625cb58201 100644 --- a/src/Mod/Mesh/Gui/Command.cpp +++ b/src/Mod/Mesh/Gui/Command.cpp @@ -706,7 +706,7 @@ void CmdMeshVertexCurvatureInfo::activated(int) viewer->setEditing(true); viewer->setRedirectToSceneGraph(true); viewer->setSelectionEnabled(false); - viewer->setEditingCursor(QCursor(Gui::BitmapFactory().pixmapFromSvg("mesh_pipette",QSize(32,32)),4,29)); + viewer->setEditingCursor(QCursor(Gui::BitmapFactory().pixmapFromSvg("Mesh_Pipette",QSize(32,32)),4,29)); viewer->addEventCallback(SoEvent::getClassTypeId(), MeshGui::ViewProviderMeshCurvature::curvatureInfoCallback); } @@ -896,7 +896,7 @@ CmdMeshPolyCut::CmdMeshPolyCut() sToolTipText = QT_TR_NOOP("Cuts a mesh with a picked polygon"); sWhatsThis = "Mesh_PolyCut"; sStatusTip = QT_TR_NOOP("Cuts a mesh with a picked polygon"); - sPixmap = "mesh_cut"; + sPixmap = "Mesh_Cut"; } void CmdMeshPolyCut::activated(int) @@ -1199,7 +1199,7 @@ CmdMeshEvaluateFacet::CmdMeshEvaluateFacet() sToolTipText = QT_TR_NOOP("Information about face"); sWhatsThis = "Mesh_EvaluateFacet"; sStatusTip = QT_TR_NOOP("Information about face"); - sPixmap = "mesh_pipette"; + sPixmap = "Mesh_Pipette"; } void CmdMeshEvaluateFacet::activated(int) @@ -1209,7 +1209,7 @@ void CmdMeshEvaluateFacet::activated(int) if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); - viewer->setEditingCursor(QCursor(Gui::BitmapFactory().pixmapFromSvg("mesh_pipette",QSize(32,32)),4,29)); + viewer->setEditingCursor(QCursor(Gui::BitmapFactory().pixmapFromSvg("Mesh_Pipette",QSize(32,32)),4,29)); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), MeshGui::ViewProviderMeshFaceSet::faceInfoCallback); } } @@ -1675,7 +1675,7 @@ CmdMeshFillInteractiveHole::CmdMeshFillInteractiveHole() sToolTipText = QT_TR_NOOP("Close holes interactively"); sWhatsThis = "Mesh_FillInteractiveHole"; sStatusTip = QT_TR_NOOP("Close holes interactively"); - sPixmap = "mesh_boundary"; + sPixmap = "Mesh_Boundary"; } void CmdMeshFillInteractiveHole::activated(int) diff --git a/src/Mod/Mesh/Gui/Resources/Mesh.qrc b/src/Mod/Mesh/Gui/Resources/Mesh.qrc index 0168137170..e607d71a58 100644 --- a/src/Mod/Mesh/Gui/Resources/Mesh.qrc +++ b/src/Mod/Mesh/Gui/Resources/Mesh.qrc @@ -1,40 +1,40 @@ - - icons/mesh_boundary.svg - icons/mesh_cut.svg - icons/mesh_pipette.svg - icons/Tree_Mesh.svg + + icons/Mesh_Add_Facet.svg + icons/Mesh_Boundary.svg + icons/Mesh_Bounding_Box.svg + icons/Mesh_Cross_Sections.svg + icons/Mesh_Curvature_Info.svg icons/Mesh_Curvature_Plot.svg + icons/Mesh_Cut.svg + icons/Mesh_Decimating.svg + icons/Mesh_Difference.svg + icons/Mesh_Evaluate_Solid.svg + icons/Mesh_Evaluation.svg icons/Mesh_Export_Mesh.svg - icons/Mesh_Import_Mesh.svg - icons/Mesh_Mesh_from_Shape.svg icons/Mesh_Flip_Normals.svg icons/Mesh_Harmonize_Normals.svg + icons/Mesh_Import_Mesh.svg + icons/Mesh_Intersection.svg + icons/Mesh_Merge.svg + icons/Mesh_Mesh_from_Shape.svg + icons/Mesh_Pipette.svg + icons/Mesh_Poly_Trim.svg icons/Mesh_Regular_Solid.svg + icons/Mesh_Remesh_Gmsh.svg + icons/Mesh_Remove_Comp_by_Hand.svg icons/Mesh_Remove_Components.svg - icons/Mesh_Tree_Curvature_Plot.svg - icons/MeshWorkbench.svg + icons/Mesh_Scale.svg + icons/Mesh_Section_by_Plane.svg icons/Mesh_Fill_up_Holes.svg - icons/Mesh_Union.svg - icons/Mesh_Smoothing.svg icons/Mesh_Segmentation_Best_Fit.svg icons/Mesh_Segmentation.svg - icons/Mesh_Section_by_Plane.svg - icons/Mesh_Scale.svg - icons/Mesh_Remove_Comp_by_Hand.svg - icons/Mesh_Remesh_Gmsh.svg - icons/Mesh_Poly_Trim.svg - icons/Mesh_Merge.svg - icons/Mesh_Intersection.svg - icons/Mesh_Evaluation.svg - icons/Mesh_Evaluate_Solid.svg - icons/Mesh_Difference.svg - icons/Mesh_Decimating.svg - icons/Mesh_Curvature_Info.svg - icons/Mesh_Cross_Sections.svg - icons/Mesh_Bounding_Box.svg - icons/Mesh_Add_Facet.svg + icons/Mesh_Smoothing.svg + icons/Mesh_Tree.svg + icons/Mesh_Tree_Curvature_Plot.svg icons/Mesh_Trim_by_Plane.svg + icons/Mesh_Union.svg + icons/MeshWorkbench.svg icons/RegularSolids/Mesh_Cone.svg icons/RegularSolids/Mesh_Cube.svg icons/RegularSolids/Mesh_Cylinder.svg diff --git a/src/Mod/Mesh/Gui/Resources/icons/mesh_boundary.svg b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Boundary.svg similarity index 97% rename from src/Mod/Mesh/Gui/Resources/icons/mesh_boundary.svg rename to src/Mod/Mesh/Gui/Resources/icons/Mesh_Boundary.svg index 872a9ef689..8ae2312e6a 100644 --- a/src/Mod/Mesh/Gui/Resources/icons/mesh_boundary.svg +++ b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Boundary.svg @@ -15,11 +15,11 @@ id="svg9484" sodipodi:version="0.32" inkscape:version="0.48.5 r10040" - sodipodi:docname="mesh_boundary.svg" + sodipodi:docname="Mesh_Boundary.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1"> mesh_boundary + id="title3749">Mesh_Boundary - mesh_boundary + Mesh_Boundary A single triangular mesh face with a hole in it @@ -124,7 +124,7 @@ http://www.freecadweb.org/wiki/index.php?title=Artwork - FreeCAD/src/Mod/Mesh/Gui/Resources/icons/mesh_boundary.svg + FreeCAD/src/Mod/Mesh/Gui/Resources/icons/Mesh_Boundary.svg FreeCAD diff --git a/src/Mod/Mesh/Gui/Resources/icons/mesh_cut.svg b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Cut.svg similarity index 99% rename from src/Mod/Mesh/Gui/Resources/icons/mesh_cut.svg rename to src/Mod/Mesh/Gui/Resources/icons/Mesh_Cut.svg index d59704ed0c..30452a847f 100644 --- a/src/Mod/Mesh/Gui/Resources/icons/mesh_cut.svg +++ b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Cut.svg @@ -15,9 +15,9 @@ id="svg3167" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="mesh_cut.svg"> + sodipodi:docname="Mesh_Cut.svg"> mesh_cut + id="title3747">Mesh_Cut image/svg+xml - mesh_cut + Mesh_Cut https://commons.wikimedia.org/wiki/Tango_icons#/media/File:Edit-cut.svg - FreeCAD/src/Mod/Mesh/Gui/Resources/icons/mesh_cut.svg + FreeCAD/src/Mod/Mesh/Gui/Resources/icons/Mesh_Cut.svg [agryson] Alexander Gryson diff --git a/src/Mod/Mesh/Gui/Resources/icons/mesh_pipette.svg b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Pipette.svg similarity index 98% rename from src/Mod/Mesh/Gui/Resources/icons/mesh_pipette.svg rename to src/Mod/Mesh/Gui/Resources/icons/Mesh_Pipette.svg index d83fa47056..e71c744f45 100644 --- a/src/Mod/Mesh/Gui/Resources/icons/mesh_pipette.svg +++ b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Pipette.svg @@ -15,12 +15,12 @@ id="svg2" version="1.1" inkscape:version="0.48.5 r10040" - sodipodi:docname="mesh_pipette.svg" + sodipodi:docname="Mesh_Pipette.svg" inkscape:export-filename="/home/user/Downloads/cad/mystuff/icons/main_icons/pipette_32px.png" inkscape:export-xdpi="45" inkscape:export-ydpi="45"> mesh_pipette + id="title3733">Mesh_Pipette image/svg+xml - mesh_pipette + Mesh_Pipette @@ -171,7 +171,7 @@ FreeCAD - FreeCAD/src/Mod/Mesh/Gui/Resources/icons/mesh_pipette.svg + FreeCAD/src/Mod/Mesh/Gui/Resources/icons/Mesh_Pipette.svg http://www.freecadweb.org/wiki/index.php?title=Artwork diff --git a/src/Mod/Mesh/Gui/Resources/icons/Tree_Mesh.svg b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Tree.svg similarity index 98% rename from src/Mod/Mesh/Gui/Resources/icons/Tree_Mesh.svg rename to src/Mod/Mesh/Gui/Resources/icons/Mesh_Tree.svg index 69a304dab2..1c6fae59d8 100644 --- a/src/Mod/Mesh/Gui/Resources/icons/Tree_Mesh.svg +++ b/src/Mod/Mesh/Gui/Resources/icons/Mesh_Tree.svg @@ -15,11 +15,11 @@ id="svg3052" sodipodi:version="0.32" inkscape:version="0.48.5 r10040" - sodipodi:docname="Tree_Mesh.svg" + sodipodi:docname="Mesh_Tree.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1"> Tree_Mesh + id="title3725">Mesh_Tree image/svg+xml - Tree_Mesh + Mesh_Tree [agryson] Alexander Gryson @@ -127,7 +127,7 @@ FreeCAD - FreeCAD/src/Mod/Mesh/Gui/Resources/icons/Tree_Mesh.svg + FreeCAD/src/Mod/Mesh/Gui/Resources/icons/Mesh._Tree.svg http://www.freecadweb.org/wiki/index.php?title=Artwork diff --git a/src/Mod/Mesh/Gui/ViewProvider.cpp b/src/Mod/Mesh/Gui/ViewProvider.cpp index 08bbb26890..1cb57b763f 100644 --- a/src/Mod/Mesh/Gui/ViewProvider.cpp +++ b/src/Mod/Mesh/Gui/ViewProvider.cpp @@ -503,7 +503,7 @@ void ViewProviderMesh::updateData(const App::Property* prop) QIcon ViewProviderMesh::getIcon() const { #if 1 - static QIcon icon = Gui::BitmapFactory().pixmap("Tree_Mesh"); + static QIcon icon = Gui::BitmapFactory().pixmap("Mesh_Tree"); return icon; #else static const char * const Mesh_Feature_xpm[] = {