diff --git a/src/App/PropertyStandard.cpp b/src/App/PropertyStandard.cpp index 7ff3b24f0b..086b4d9509 100644 --- a/src/App/PropertyStandard.cpp +++ b/src/App/PropertyStandard.cpp @@ -1752,6 +1752,16 @@ void PropertyStringList::setPyObject(PyObject *value) if (PyString_Check(value)) { setValue(PyString_AsString(value)); } +#endif + else if (PyUnicode_Check(value)) { +#if PY_MAJOR_VERSION >= 3 + setValue(PyUnicode_AsUTF8(value)); + } +#else + PyObject* unicode = PyUnicode_AsUTF8String(value); + setValue(PyString_AsString(unicode)); + Py_DECREF(unicode); + } #endif else if (PySequence_Check(value)) { Py_ssize_t nSize = PySequence_Size(value); @@ -1781,16 +1791,6 @@ void PropertyStringList::setPyObject(PyObject *value) setValues(values); } - else if (PyUnicode_Check(value)) { -#if PY_MAJOR_VERSION >= 3 - setValue(PyUnicode_AsUTF8(value)); - } -#else - PyObject* unicode = PyUnicode_AsUTF8String(value); - setValue(PyString_AsString(unicode)); - Py_DECREF(unicode); - } -#endif else { std::string error = std::string("type must be str or unicode or list of str or list of unicodes, not "); error += value->ob_type->tp_name; diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index 01a3e816d2..47d874d021 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -23,6 +23,7 @@ #* * #*************************************************************************** +import sys import FreeCAD,Draft,ArchComponent,DraftVecUtils from FreeCAD import Vector if FreeCAD.GuiUp: @@ -48,6 +49,24 @@ __url__ = "http://www.freecadweb.org" # module functions ############################################### + +def string_replace(text, pattern, replacement): + """ + if py2 isn't supported anymore calls to this function + should be replaced with: + `text.replace(pattern, replacement)` + for python2 the encoding must be done, as unicode replacement leads to something like this: + ``` + >>> a = u'abc mm ^3' + >>> a.replace(u"^3", u"³") + u'abc mm \xc2\xb3' + ``` + """ + if sys.version_info.major < 3: + text = text.encode("utf8") + return text.replace(pattern, replacement) + + def getStringList(objects): '''getStringList(objects): returns a string defining a list of objects''' @@ -807,14 +826,14 @@ def survey(callback=False): if o.Object.Shape.Solids: u = FreeCAD.Units.Quantity(o.Object.Shape.Volume,FreeCAD.Units.Volume) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^3","³") + t = string_replace(t, "^3","³") anno.LabelText = "v " + t FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Volume: " + utf8_decode(t) + "\n") FreeCAD.SurveyObserver.totalVolume += u.Value elif o.Object.Shape.Faces: u = FreeCAD.Units.Quantity(o.Object.Shape.Area,FreeCAD.Units.Area) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^2","²") + t = string_replace(t, "^2","²") anno.LabelText = "a " + t FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Area: " + utf8_decode(t) + "\n") FreeCAD.SurveyObserver.totalArea += u.Value @@ -850,7 +869,7 @@ def survey(callback=False): if "Face" in el: u = FreeCAD.Units.Quantity(e.Area,FreeCAD.Units.Area) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^2","²") + t = string_replace(t, "^2","²") anno.LabelText = "a " + t FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Area: "+ utf8_decode(t) + "\n") FreeCAD.SurveyObserver.totalArea += u.Value @@ -859,7 +878,8 @@ def survey(callback=False): elif "Edge" in el: u= FreeCAD.Units.Quantity(e.Length,FreeCAD.Units.Length) t = u.getUserPreferred()[0] - t = t.encode("utf8") + if sys.version_info.major < 3: + t = t.encode("utf8") anno.LabelText = "l " + t FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Length: " + utf8_decode(t) + "\n") FreeCAD.SurveyObserver.totalLength += u.Value @@ -884,17 +904,18 @@ def survey(callback=False): if FreeCAD.SurveyObserver.totalLength: u = FreeCAD.Units.Quantity(FreeCAD.SurveyObserver.totalLength,FreeCAD.Units.Length) t = u.getUserPreferred()[0] - t = t.encode("utf8") + if sys.version_info.major < 3: + t = t.encode("utf8") msg += " Length: " + t if FreeCAD.SurveyObserver.totalArea: u = FreeCAD.Units.Quantity(FreeCAD.SurveyObserver.totalArea,FreeCAD.Units.Area) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^2","²") + t = string_replace(t, "^2","²") msg += " Area: " + t if FreeCAD.SurveyObserver.totalVolume: u = FreeCAD.Units.Quantity(FreeCAD.SurveyObserver.totalVolume,FreeCAD.Units.Volume) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^3","³") + t = string_replace(t, "^3","³") msg += " Volume: " + t FreeCAD.Console.PrintMessage(msg+"\n") @@ -1001,7 +1022,7 @@ class SurveyTaskPanel: if hasattr(FreeCAD,"SurveyObserver"): u = FreeCAD.Units.Quantity(FreeCAD.SurveyObserver.totalArea,FreeCAD.Units.Area) t = u.getUserPreferred()[0] - t = t.encode("utf8").replace("^2","²") + t = string_replace(t, "^2","²") if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("surveyUnits",True): QtGui.QApplication.clipboard().setText(t) else: @@ -1038,7 +1059,7 @@ class SurveyTaskPanel: def update(self,column,txt): item = QtGui.QTreeWidgetItem(self.tree) self.tree.setCurrentItem(item) - item.setText(column,txt.decode("utf8")) + item.setText(column,utf8_decode(txt)) def setDescr(self,item,col): self.descr.setText(item.text(0))