py3: Draft: string / unicode:

issue 0000995
- use optional argument to get unicode from translation in python2
- add a utf8_decode function to get unicode from string, bytes, unicode
This commit is contained in:
looooo
2017-06-20 00:38:36 +02:00
committed by wmayer
parent 0f199064f3
commit 10866d38d3
9 changed files with 79 additions and 50 deletions

View File

@@ -28,7 +28,7 @@ from FreeCAD import Vector
if FreeCAD.GuiUp:
import FreeCADGui
from PySide import QtGui,QtCore
from DraftTools import translate
from DraftTools import translate, utf8_decode
else:
# \cond
def translate(ctxt,txt):
@@ -809,19 +809,19 @@ def survey(callback=False):
t = u.getUserPreferred()[0]
t = t.encode("utf8").replace("^3","³")
anno.LabelText = "v " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Volume: " + t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Volume: " + utf8_decode(t) + "\n")
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","²")
anno.LabelText = "a " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Area: " + t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Area: " + utf8_decode(t) + "\n")
else:
u = FreeCAD.Units.Quantity(o.Object.Shape.Length,FreeCAD.Units.Length)
t = u.getUserPreferred()[0]
t = t.encode("utf8")
anno.LabelText = "l " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Length: " + t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: Whole, Length: " + utf8_decode(t) + "\n")
if FreeCAD.GuiUp and t:
if showUnit:
QtGui.qApp.clipboard().setText(t)
@@ -845,19 +845,19 @@ def survey(callback=False):
t = u.getUserPreferred()[0]
t = t.encode("utf8").replace("^2","²")
anno.LabelText = "a " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Area: "+ t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Area: "+ utf8_decode(t) + "\n")
elif "Edge" in el:
u= FreeCAD.Units.Quantity(e.Length,FreeCAD.Units.Length)
t = u.getUserPreferred()[0]
t = t.encode("utf8")
anno.LabelText = "l " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Length: " + t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Length: " + utf8_decode(t) + "\n")
elif "Vertex" in el:
u = FreeCAD.Units.Quantity(e.Z,FreeCAD.Units.Length)
t = u.getUserPreferred()[0]
t = t.encode("utf8")
anno.LabelText = "z " + t
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Zcoord: " + t.decode("utf8") + "\n")
FreeCAD.Console.PrintMessage("Object: " + n + ", Element: " + el + ", Zcoord: " + utf8_decode(t) + "\n")
if FreeCAD.GuiUp and t:
if showUnit:
QtGui.qApp.clipboard().setText(t)
@@ -1229,7 +1229,7 @@ class _CommandCheck:
else:
FreeCADGui.Selection.clearSelection()
for i in result:
FreeCAD.Console.PrintWarning("Object "+i[0].Name+" ("+i[0].Label+") "+i[1].decode("utf8"))
FreeCAD.Console.PrintWarning("Object "+i[0].Name+" ("+i[0].Label+") "+ utf8_decode(i[1]))
FreeCADGui.Selection.addSelection(i[0])

View File

@@ -197,11 +197,11 @@ class CommandPanel:
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Panel options").decode("utf8"))
w.setWindowTitle(translate("Arch","Panel options", utf8_decode=True))
grid = QtGui.QGridLayout(w)
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8"))
labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True))
valuep = QtGui.QComboBox()
fpresets = [" "]
for p in Presets[1:]:
@@ -211,32 +211,32 @@ class CommandPanel:
grid.addWidget(valuep,0,1,1,1)
# length
label1 = QtGui.QLabel(translate("Arch","Length").decode("utf8"))
label1 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True))
self.vLength = ui.createWidget("Gui::InputField")
self.vLength.setText(FreeCAD.Units.Quantity(self.Length,FreeCAD.Units.Length).UserString)
grid.addWidget(label1,1,0,1,1)
grid.addWidget(self.vLength,1,1,1,1)
# width
label2 = QtGui.QLabel(translate("Arch","Width").decode("utf8"))
label2 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True))
self.vWidth = ui.createWidget("Gui::InputField")
self.vWidth.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
grid.addWidget(label2,2,0,1,1)
grid.addWidget(self.vWidth,2,1,1,1)
# height
label3 = QtGui.QLabel(translate("Arch","Thickness").decode("utf8"))
label3 = QtGui.QLabel(translate("Arch","Thickness", utf8_decode=True))
self.vHeight = ui.createWidget("Gui::InputField")
self.vHeight.setText(FreeCAD.Units.Quantity(self.Thickness,FreeCAD.Units.Length).UserString)
grid.addWidget(label3,3,0,1,1)
grid.addWidget(self.vHeight,3,1,1,1)
# horizontal button
value5 = QtGui.QPushButton(translate("Arch","Rotate").decode("utf8"))
value5 = QtGui.QPushButton(translate("Arch","Rotate", utf8_decode=True))
grid.addWidget(value5,4,0,1,2)
# continue button
label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8"))
label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)

View File

@@ -247,18 +247,18 @@ class _CommandStructure:
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Structure options").decode("utf8"))
w.setWindowTitle(translate("Arch","Structure options", utf8_decode=True))
grid = QtGui.QGridLayout(w)
# categories box
labelc = QtGui.QLabel(translate("Arch","Category").decode("utf8"))
labelc = QtGui.QLabel(translate("Arch","Category", utf8_decode=True))
valuec = QtGui.QComboBox()
valuec.addItems([" ","Precast concrete"]+Categories)
grid.addWidget(labelc,0,0,1,1)
grid.addWidget(valuec,0,1,1,1)
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8"))
labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True))
self.vPresets = QtGui.QComboBox()
self.pSelect = [None]
fpresets = [" "]
@@ -267,34 +267,34 @@ class _CommandStructure:
grid.addWidget(self.vPresets,1,1,1,1)
# length
label1 = QtGui.QLabel(translate("Arch","Length").decode("utf8"))
label1 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True))
self.vLength = ui.createWidget("Gui::InputField")
self.vLength.setText(FreeCAD.Units.Quantity(self.Length,FreeCAD.Units.Length).UserString)
grid.addWidget(label1,2,0,1,1)
grid.addWidget(self.vLength,2,1,1,1)
# width
label2 = QtGui.QLabel(translate("Arch","Width").decode("utf8"))
label2 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True))
self.vWidth = ui.createWidget("Gui::InputField")
self.vWidth.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
grid.addWidget(label2,3,0,1,1)
grid.addWidget(self.vWidth,3,1,1,1)
# height
label3 = QtGui.QLabel(translate("Arch","Height").decode("utf8"))
label3 = QtGui.QLabel(translate("Arch","Height", utf8_decode=True))
self.vHeight = ui.createWidget("Gui::InputField")
self.vHeight.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString)
grid.addWidget(label3,4,0,1,1)
grid.addWidget(self.vHeight,4,1,1,1)
# horizontal button
value5 = QtGui.QPushButton(translate("Arch","Switch L/H").decode("utf8"))
value5 = QtGui.QPushButton(translate("Arch","Switch L/H", utf8_decode=True))
grid.addWidget(value5,5,0,1,1)
value6 = QtGui.QPushButton(translate("Arch","Switch L/W").decode("utf8"))
value6 = QtGui.QPushButton(translate("Arch","Switch L/W", utf8_decode=True))
grid.addWidget(value6,5,1,1,1)
# continue button
label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8"))
label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)

View File

@@ -303,7 +303,7 @@ class _CommandWall:
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Wall options").decode("utf8"))
w.setWindowTitle(translate("Arch","Wall options", utf8_decode=True))
grid = QtGui.QGridLayout(w)
matCombo = QtGui.QComboBox()
@@ -321,25 +321,25 @@ class _CommandWall:
self.MultiMat = o
grid.addWidget(matCombo,0,0,1,2)
label5 = QtGui.QLabel(translate("Arch","Length").decode("utf8"))
label5 = QtGui.QLabel(translate("Arch","Length", utf8_decode=True))
self.Length = ui.createWidget("Gui::InputField")
self.Length.setText("0.00 mm")
grid.addWidget(label5,1,0,1,1)
grid.addWidget(self.Length,1,1,1,1)
label1 = QtGui.QLabel(translate("Arch","Width").decode("utf8"))
label1 = QtGui.QLabel(translate("Arch","Width", utf8_decode=True))
value1 = ui.createWidget("Gui::InputField")
value1.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
grid.addWidget(label1,2,0,1,1)
grid.addWidget(value1,2,1,1,1)
label2 = QtGui.QLabel(translate("Arch","Height").decode("utf8"))
label2 = QtGui.QLabel(translate("Arch","Height", utf8_decode=True))
value2 = ui.createWidget("Gui::InputField")
value2.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString)
grid.addWidget(label2,3,0,1,1)
grid.addWidget(value2,3,1,1,1)
label3 = QtGui.QLabel(translate("Arch","Alignment").decode("utf8"))
label3 = QtGui.QLabel(translate("Arch","Alignment", utf8_decode=True))
value3 = QtGui.QComboBox()
items = ["Center","Left","Right"]
value3.addItems(items)
@@ -347,7 +347,7 @@ class _CommandWall:
grid.addWidget(label3,4,0,1,1)
grid.addWidget(value3,4,1,1,1)
label4 = QtGui.QLabel(translate("Arch","Con&tinue").decode("utf8"))
label4 = QtGui.QLabel(translate("Arch","Con&tinue", utf8_decode=True))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)

View File

@@ -538,24 +538,24 @@ class _CommandWindow:
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Window options").decode("utf8"))
w.setWindowTitle(translate("Arch","Window options", utf8_decode=True))
grid = QtGui.QGridLayout(w)
# include box
include = QtGui.QCheckBox(translate("Arch","Auto include in host object").decode("utf8"))
include = QtGui.QCheckBox(translate("Arch","Auto include in host object", utf8_decode=True))
include.setChecked(True)
grid.addWidget(include,0,0,1,2)
QtCore.QObject.connect(include,QtCore.SIGNAL("stateChanged(int)"),self.setInclude)
# sill height
labels = QtGui.QLabel(translate("Arch","Sill height").decode("utf8"))
labels = QtGui.QLabel(translate("Arch","Sill height", utf8_decode=True))
values = ui.createWidget("Gui::InputField")
grid.addWidget(labels,1,0,1,1)
grid.addWidget(values,1,1,1,1)
QtCore.QObject.connect(values,QtCore.SIGNAL("valueChanged(double)"),self.setSill)
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset").decode("utf8"))
labelp = QtGui.QLabel(translate("Arch","Preset", utf8_decode=True))
valuep = QtGui.QComboBox()
valuep.addItems(WindowPresets)
valuep.setCurrentIndex(self.Preset)
@@ -573,7 +573,7 @@ class _CommandWindow:
# parameters
i = 4
for param in self.wparams:
lab = QtGui.QLabel(translate("Arch",param).decode("utf8"))
lab = QtGui.QLabel(translate("Arch",param, utf8_decode=True))
setattr(self,"val"+param,ui.createWidget("Gui::InputField"))
wid = getattr(self,"val"+param)
if param == "Width":

View File

@@ -76,7 +76,7 @@ def insert(filename,docname):
def decode(name):
"decodes encoded strings"
try:
decodedName = (name.decode("utf8"))
decodedName = (utf8_decode(name))
except UnicodeDecodeError:
try:
decodedName = (name.decode("latin1"))

View File

@@ -126,7 +126,7 @@ def export(exportList,filename):
outfile = pythonopen(filename,"wb")
outfile.write(html)
outfile.close()
FreeCAD.Console.PrintMessage(translate("Arch","successfully written ").decode("utf8")+filename+"\n")
FreeCAD.Console.PrintMessage(translate("Arch","successfully written ", utf8_decode=True)+filename+"\n")
def getHTML(objectsList):
"returns the complete HTML code of a viewer for the given objects"

View File

@@ -40,6 +40,7 @@ Report to Draft.py for info
'''
import FreeCAD, FreeCADGui, os, Draft, sys, DraftVecUtils, math
from DraftTools import utf8_decode
try:
from PySide import QtCore,QtGui,QtSvg
@@ -883,7 +884,7 @@ class DraftToolBar:
def labelUi(self,title=translate("draft","Label"),callback=None):
w = QtGui.QWidget()
w.setWindowTitle(translate("draft","Label type").decode("utf8"))
w.setWindowTitle(translate("draft","Label type", utf8_decode=True))
l = QtGui.QVBoxLayout(w)
combo = QtGui.QComboBox()
for s in ["Custom","Name","Label","Position","Length","Area","Volume","Tag","Material"]:
@@ -1373,7 +1374,7 @@ class DraftToolBar:
dialogFilter)
# print(fname)
#fname = str(fname.toUtf8()) # QString to PyString
fname = fname[0].decode("utf8")
fname = utf8_decode(fname[0])
# print("debug: D_G DraftToolBar.pickFile type(fname): " str(type(fname)))
except Exception as e:
@@ -1392,7 +1393,7 @@ class DraftToolBar:
if self.sourceCmd:
if (self.labelFFile.isVisible()):
if self.FFileValue.text():
self.sourceCmd.validFFile(self.FFileValue.text().decode("utf8")) #QString to PyString
self.sourceCmd.validFFile(utf8_decode(self.FFileValue.text())) #QString to PyString
else:
FreeCAD.Console.PrintMessage(translate("draft", "Please enter a font file."))

View File

@@ -76,20 +76,48 @@ MODALT = MODS[Draft.getParam("modalt",2)]
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def translate(context, text):
"convenience function for Qt translator"
if sys.version_info.major >= 3:
def translate(context, text, utf8_decode=False):
"""convenience function for Qt translator
context: str
context is typically a class name (e.g., "MyDialog")
text: str
text which gets translated
utf8_decode: bool [False]
if set to true utf8 encoded unicode will be returned. This option does not have influence
on python3 as for python3 we are returning utf-8 encoded unicode by default!
"""
if sys.version_info.major >= 3 or utf8_decode:
return QtGui.QApplication.translate(context, text, None, _encoding)
else:
return QtGui.QApplication.translate(context, text, None, _encoding).encode("utf8")
except AttributeError:
def translate(context, text):
"convenience function for Qt translator"
if sys.version >= 3:
def translate(context, text, utf8_decode=False):
"""convenience function for Qt translator
context: str
context is typically a class name (e.g., "MyDialog")
text: str
text which gets translated
utf8_decode: bool [False]
if set to true utf8 encoded unicode will be returned. This option does not have influence
on python3 as for python3 we are returning utf-8 encoded unicode by default!
"""
if sys.version >= 3 or utf8_decode:
return QtGui.QApplication.translate(context, text, None)
else:
return QtGui.QApplication.translate(context, text, None).encode("utf8")
def utf8_decode(text):
"""py2: str -> unicode
unicode -> unicode
py3: str -> str
bytes -> str
"""
try:
return text.decode("utf-8")
except AttributeError:
return text
def msg(text=None,mode=None):
"prints the given message on the FreeCAD status bar"
if not text: FreeCAD.Console.PrintMessage("")
@@ -2253,7 +2281,7 @@ class Move(Modifier):
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Move", "Moves the selected objects between 2 points. CTRL to snap, SHIFT to constrain, ALT to copy")}
def Activated(self):
self.name = translate("draft","Move").decode("utf8")
self.name = translate("draft","Move", utf8_decode=True)
Modifier.Activated(self,self.name)
self.ghost = None
if self.ui:
@@ -3536,7 +3564,7 @@ class Scale(Modifier):
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Scale", "Scales the selected objects from a base point. CTRL to snap, SHIFT to constrain, ALT to copy")}
def Activated(self):
self.name = translate("draft","Scale").decode("utf8")
self.name = translate("draft","Scale", utf8_decode=True)
Modifier.Activated(self,self.name)
self.ghost = None
if self.ui:
@@ -4970,7 +4998,7 @@ class Mirror(Modifier):
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Mirror", "Mirrors the selected objects along a line defined by two points")}
def Activated(self):
self.name = translate("draft","Mirror").decode("utf8")
self.name = translate("draft","Mirror", utf8_decode=True)
Modifier.Activated(self,self.name)
self.ghost = None
if self.ui:
@@ -5215,7 +5243,7 @@ class Draft_Label(Creator):
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Label", "Creates a label, optionally attached to a selected object or element")}
def Activated(self):
self.name = translate("draft","Label").decode("utf8")
self.name = translate("draft","Label", utf8_decode=True)
Creator.Activated(self,self.name,noplanesetup=True)
self.ghost = None
self.labeltype = Draft.getParam("labeltype","Custom")