From bed3dd2372f5cc0ec34071efb8635f95bf3e0e3d Mon Sep 17 00:00:00 2001 From: vocx-fc Date: Tue, 16 Jun 2020 21:09:03 -0500 Subject: [PATCH] Draft: improve setting of properties of dimensions, labels, and texts Add view properties of dimensions, labels, and text objects through methods, calling the parent classes, and `ViewProviderDraftAnnotation` when needed. --- src/Mod/Draft/Draft.py | 14 +- .../draftviewproviders/view_dimension.py | 269 ++++++++++++------ .../Draft/draftviewproviders/view_label.py | 156 ++++++---- src/Mod/Draft/draftviewproviders/view_text.py | 66 +++-- 4 files changed, 331 insertions(+), 174 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 2f645a92be..d5c9308f50 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -397,10 +397,10 @@ from draftmake.make_dimension import (make_dimension, makeAngularDimension) if FreeCAD.GuiUp: - from draftviewproviders.view_dimension import ViewProviderLinearDimension - from draftviewproviders.view_dimension import ViewProviderAngularDimension - _ViewProviderDimension = ViewProviderLinearDimension - _ViewProviderAngularDimension = ViewProviderAngularDimension + from draftviewproviders.view_dimension import (ViewProviderLinearDimension, + _ViewProviderDimension, + ViewProviderAngularDimension, + _ViewProviderAngularDimension) from draftobjects.label import (Label, DraftLabel) @@ -408,9 +408,9 @@ from draftobjects.label import (Label, from draftmake.make_label import (make_label, makeLabel) -if gui: - from draftviewproviders.view_label import ViewProviderLabel - ViewProviderDraftLabel = ViewProviderLabel +if FreeCAD.GuiUp: + from draftviewproviders.view_label import (ViewProviderLabel, + ViewProviderDraftLabel) from draftobjects.text import (Text, DraftText) diff --git a/src/Mod/Draft/draftviewproviders/view_dimension.py b/src/Mod/Draft/draftviewproviders/view_dimension.py index d56e100959..85c4209177 100644 --- a/src/Mod/Draft/draftviewproviders/view_dimension.py +++ b/src/Mod/Draft/draftviewproviders/view_dimension.py @@ -86,92 +86,179 @@ class ViewProviderDimensionBase(ViewProviderDraftAnnotation): """ def __init__(self, vobj): - super(ViewProviderDimensionBase, self).__init__(vobj) - # text properties - vobj.addProperty("App::PropertyFont","FontName", - "Text", - QT_TRANSLATE_NOOP("App::Property","Font name")) - vobj.addProperty("App::PropertyLength","FontSize", - "Text", - QT_TRANSLATE_NOOP("App::Property","Font size")) - vobj.addProperty("App::PropertyLength","TextSpacing", - "Text", - QT_TRANSLATE_NOOP("App::Property", - "Spacing between text and dimension line")) - vobj.addProperty("App::PropertyBool","FlipText", - "Text", - QT_TRANSLATE_NOOP("App::Property", - "Rotate the dimension text 180 degrees")) - vobj.addProperty("App::PropertyVectorDistance","TextPosition", - "Text", - QT_TRANSLATE_NOOP("App::Property", - "Text Position. \n" - "Leave (0,0,0) for automatic position")) - vobj.addProperty("App::PropertyString","Override", - "Text", - QT_TRANSLATE_NOOP("App::Property", - "Text override. \n" - "Use $dim to insert the dimension length")) + self.set_properties(vobj) + self.Object = vobj.Object + vobj.Proxy = self - # units properties - vobj.addProperty("App::PropertyInteger","Decimals", - "Units", - QT_TRANSLATE_NOOP("App::Property", - "The number of decimals to show")) - vobj.addProperty("App::PropertyBool","ShowUnit", - "Units", - QT_TRANSLATE_NOOP("App::Property", - "Show the unit suffix")) - vobj.addProperty("App::PropertyString","UnitOverride", - "Units", - QT_TRANSLATE_NOOP("App::Property", - "A unit to express the measurement. \n" - "Leave blank for system default")) + def set_properties(self, vobj): + """Set the properties only if they don't already exist.""" + super(ViewProviderDimensionBase, self).set_properties(vobj) - # graphics properties - vobj.addProperty("App::PropertyLength","ArrowSize", - "Graphics", - QT_TRANSLATE_NOOP("App::Property","Arrow size")) - vobj.addProperty("App::PropertyEnumeration","ArrowType", - "Graphics", - QT_TRANSLATE_NOOP("App::Property","Arrow type")) - vobj.addProperty("App::PropertyBool","FlipArrows", - "Graphics", - QT_TRANSLATE_NOOP("App::Property", - "Rotate the dimension arrows 180 degrees")) - vobj.addProperty("App::PropertyDistance","DimOvershoot", - "Graphics", - QT_TRANSLATE_NOOP("App::Property", - "The distance the dimension line is extended\n" - "past the extension lines")) - vobj.addProperty("App::PropertyDistance","ExtLines", - "Graphics", - QT_TRANSLATE_NOOP("App::Property", - "Length of the extension lines")) - vobj.addProperty("App::PropertyDistance","ExtOvershoot", - "Graphics", - QT_TRANSLATE_NOOP("App::Property", - "Length of the extension line \n" - "above the dimension line")) - vobj.addProperty("App::PropertyBool","ShowLine", - "Graphics", - QT_TRANSLATE_NOOP("App::Property", - "Shows the dimension line and arrows")) - - vobj.FontSize = utils.get_param("textheight",0.20) - vobj.TextSpacing = utils.get_param("dimspacing",0.05) - vobj.FontName = utils.get_param("textfont","") - vobj.ArrowSize = utils.get_param("arrowsize",0.1) - vobj.ArrowType = utils.ARROW_TYPES - vobj.ArrowType = utils.ARROW_TYPES[utils.get_param("dimsymbol",0)] - vobj.ExtLines = utils.get_param("extlines",0.3) - vobj.DimOvershoot = utils.get_param("dimovershoot",0) - vobj.ExtOvershoot = utils.get_param("extovershoot",0) - vobj.Decimals = utils.get_param("dimPrecision",2) - vobj.ShowUnit = utils.get_param("showUnit",True) - vobj.ShowLine = True + properties = vobj.PropertiesList + self.set_text_properties(vobj, properties) + self.set_units_properties(vobj, properties) + self.set_graphics_properties(vobj, properties) + + def set_text_properties(self, vobj, properties): + """Set text properties only if they don't already exist.""" + if "FontName" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Font name") + vobj.addProperty("App::PropertyFont", + "FontName", + "Text", + _tip) + vobj.FontName = utils.get_param("textfont", "") + + if "FontSize" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Font size") + vobj.addProperty("App::PropertyLength", + "FontSize", + "Text", + _tip) + vobj.FontSize = utils.get_param("textheight", 0.20) + + if "TextSpacing" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Spacing between text and dimension line") + vobj.addProperty("App::PropertyLength", + "TextSpacing", + "Text", + _tip) + vobj.TextSpacing = utils.get_param("dimspacing", 0.05) + + if "FlipText" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Rotate the dimension text 180 degrees") + vobj.addProperty("App::PropertyBool", + "FlipText", + "Text", + _tip) + vobj.FlipText = False + + if "TextPosition" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Text Position.\n" + "Leave '(0,0,0)' for automatic position") + vobj.addProperty("App::PropertyVectorDistance", + "TextPosition", + "Text", + _tip) + vobj.TextPosition = App.Vector(0, 0, 0) + + if "Override" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Text override.\n" + "Use '$dim' so that it is replaced by " + "the dimension length.") + vobj.addProperty("App::PropertyString", + "Override", + "Text", + _tip) + vobj.Override = '' + + def set_units_properties(self, vobj, properties): + """Set unit properties only if they don't already exist.""" + if "Decimals" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The number of decimals to show") + vobj.addProperty("App::PropertyInteger", + "Decimals", + "Units", + _tip) + vobj.Decimals = utils.get_param("dimPrecision", 2) + + if "ShowUnit" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Show the unit suffix") + vobj.addProperty("App::PropertyBool", + "ShowUnit", + "Units", + _tip) + vobj.ShowUnit = utils.get_param("showUnit", True) + + if "UnitOverride" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "A unit to express the measurement.\n" + "Leave blank for system default") + vobj.addProperty("App::PropertyString", + "UnitOverride", + "Units", + _tip) + + def set_graphics_properties(self, vobj, properties): + """Set graphics properties only if they don't already exist.""" + super(ViewProviderDimensionBase, self).set_graphics_properties(vobj, properties) + + if "ArrowSize" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Arrow size") + vobj.addProperty("App::PropertyLength", + "ArrowSize", + "Graphics", + _tip) + vobj.ArrowSize = utils.get_param("arrowsize", 1) + + if "ArrowType" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Arrow type") + vobj.addProperty("App::PropertyEnumeration", + "ArrowType", + "Graphics", + _tip) + vobj.ArrowType = utils.ARROW_TYPES + vobj.ArrowType = utils.ARROW_TYPES[utils.get_param("dimsymbol", 0)] + + if "FlipArrows" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Rotate the dimension arrows 180 degrees") + vobj.addProperty("App::PropertyBool", + "FlipArrows", + "Graphics", + _tip) + vobj.FlipArrows = False + + if "DimOvershoot" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The distance the dimension line " + "is extended\n" + "past the extension lines") + vobj.addProperty("App::PropertyDistance", + "DimOvershoot", + "Graphics", + _tip) + vobj.DimOvershoot = utils.get_param("dimovershoot", 0) + + if "ExtLines" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Length of the extension lines") + vobj.addProperty("App::PropertyDistance", + "ExtLines", + "Graphics", + _tip) + vobj.ExtLines = utils.get_param("extlines", 0.3) + + if "ExtOvershoot" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Length of the extension line\n" + "above the dimension line") + vobj.addProperty("App::PropertyDistance", + "ExtOvershoot", + "Graphics", + _tip) + vobj.ExtOvershoot = utils.get_param("extovershoot", 0) + + if "ShowLine" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Shows the dimension line and arrows") + vobj.addProperty("App::PropertyBool", + "ShowLine", + "Graphics", + _tip) + vobj.ShowLine = True def updateData(self, obj, prop): """called when the base object is changed""" @@ -216,9 +303,9 @@ class ViewProviderLinearDimension(ViewProviderDimensionBase): A View Provider for the Draft Linear Dimension object """ def __init__(self, vobj): - super(ViewProviderLinearDimension, self).__init__(vobj) - + super(ViewProviderLinearDimension, self).set_properties(vobj) + self.Object = vobj.Object vobj.Proxy = self @@ -658,16 +745,16 @@ class ViewProviderLinearDimension(ViewProviderDimensionBase): return ":/icons/Draft_Dimension_Tree.svg" +# Alias for compatibility with v0.18 and earlier +_ViewProviderDimension = ViewProviderLinearDimension + + class ViewProviderAngularDimension(ViewProviderDimensionBase): """A View Provider for the Draft Angular Dimension object""" def __init__(self, vobj): - super(ViewProviderAngularDimension, self).__init__(vobj) + super(ViewProviderAngularDimension, self).set_properties(vobj) - vobj.addProperty("App::PropertyBool","FlipArrows", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "Rotate the dimension arrows 180 degrees")) - self.Object = vobj.Object vobj.Proxy = self @@ -926,3 +1013,7 @@ class ViewProviderAngularDimension(ViewProviderDimensionBase): def getIcon(self): return ":/icons/Draft_DimensionAngular.svg" + + +# Alias for compatibility with v0.18 and earlier +_ViewProviderAngularDimension = ViewProviderAngularDimension diff --git a/src/Mod/Draft/draftviewproviders/view_label.py b/src/Mod/Draft/draftviewproviders/view_label.py index 9495b21058..4f5577bb70 100644 --- a/src/Mod/Draft/draftviewproviders/view_label.py +++ b/src/Mod/Draft/draftviewproviders/view_label.py @@ -45,79 +45,123 @@ class ViewProviderLabel(ViewProviderDraftAnnotation): """A View Provider for the Label annotation object""" def __init__(self,vobj): - super(ViewProviderLabel, self).__init__(vobj) self.set_properties(vobj) - self.Object = vobj.Object vobj.Proxy = self def set_properties(self, vobj): + """Set the properties only if they don't already exist.""" + super(ViewProviderLabel, self).set_properties(vobj) - # Text properties + properties = vobj.PropertiesList + self.set_text_properties(vobj, properties) + self.set_graphics_properties(vobj, properties) - vobj.addProperty("App::PropertyLength","TextSize", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The size of the text")) + def set_text_properties(self, vobj, properties): + """Set text properties only if they don't already exist.""" + if "TextSize" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The size of the text") + vobj.addProperty("App::PropertyLength", + "TextSize", + "Text", + _tip) + vobj.TextSize = utils.get_param("textheight", 1) - vobj.addProperty("App::PropertyFont","TextFont", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The font of the text")) + if "TextFont" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The font of the text") + vobj.addProperty("App::PropertyFont", + "TextFont", + "Text", + _tip) + vobj.TextFont = utils.get_param("textfont") - vobj.addProperty("App::PropertyEnumeration","TextAlignment", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The vertical alignment of the text")) + if "TextAlignment" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The vertical alignment of the text") + vobj.addProperty("App::PropertyEnumeration", + "TextAlignment", + "Text", + _tip) + vobj.TextAlignment = ["Top", "Middle", "Bottom"] + vobj.TextAlignment = "Bottom" - vobj.addProperty("App::PropertyColor","TextColor", - "Text",QT_TRANSLATE_NOOP("App::Property", - "Text color")) + if "TextColor" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Text color") + vobj.addProperty("App::PropertyColor", + "TextColor", + "Text", + _tip) - vobj.addProperty("App::PropertyInteger","MaxChars", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The maximum number of characters on each line of the text box")) + if "MaxChars" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The maximum number of characters " + "on each line of the text box") + vobj.addProperty("App::PropertyInteger", + "MaxChars", + "Text", + _tip) - # Graphics properties + def set_graphics_properties(self, vobj, properties): + """Set graphics properties only if they don't already exist.""" + if "ArrowSize" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The size of the arrow") + vobj.addProperty("App::PropertyLength", + "ArrowSize", + "Graphics", + _tip) + vobj.ArrowSize = utils.get_param("arrowsize", 1) - vobj.addProperty("App::PropertyLength","ArrowSize", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "The size of the arrow")) + if "ArrowType" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The type of arrow of this label") + vobj.addProperty("App::PropertyEnumeration", + "ArrowType", + "Graphics", + _tip) + vobj.ArrowType = utils.ARROW_TYPES + vobj.ArrowType = utils.ARROW_TYPES[utils.get_param("dimsymbol")] - vobj.addProperty("App::PropertyEnumeration","ArrowType", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "The type of arrow of this label")) + if "Frame" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The type of frame around the text " + "of this object") + vobj.addProperty("App::PropertyEnumeration", + "Frame", + "Graphics", + _tip) + vobj.Frame = ["None", "Rectangle"] - vobj.addProperty("App::PropertyEnumeration","Frame", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "The type of frame around the text of this object")) + if "Line" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Display a leader line or not") + vobj.addProperty("App::PropertyBool", + "Line", + "Graphics", + _tip) + vobj.Line = True - vobj.addProperty("App::PropertyBool","Line", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "Display a leader line or not")) - - vobj.addProperty("App::PropertyFloat","LineWidth", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "Line width")) - - vobj.addProperty("App::PropertyColor","LineColor", - "Graphics",QT_TRANSLATE_NOOP("App::Property", - "Line color")) - - self.Object = vobj.Object - vobj.TextAlignment = ["Top","Middle","Bottom"] - vobj.TextAlignment = "Middle" - vobj.LineWidth = utils.get_param("linewidth",1) - vobj.TextFont = utils.get_param("textfont") - vobj.TextSize = utils.get_param("textheight",1) - vobj.ArrowSize = utils.get_param("arrowsize",1) - vobj.ArrowType = utils.ARROW_TYPES - vobj.ArrowType = utils.ARROW_TYPES[utils.get_param("dimsymbol")] - vobj.Frame = ["None","Rectangle"] - vobj.Line = True - param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft") - annotation_scale = param.GetFloat("DraftAnnotationScale", 1.0) - vobj.ScaleMultiplier = 1 / annotation_scale + if "LineWidth" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Line width") + vobj.addProperty("App::PropertyFloat", + "LineWidth", + "Graphics", + _tip) + vobj.LineWidth = utils.get_param("linewidth", 1) + if "LineColor" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Line color") + vobj.addProperty("App::PropertyColor", + "LineColor", + "Graphics", + _tip) def getIcon(self): return ":/icons/Draft_Label.svg" @@ -322,3 +366,7 @@ class ViewProviderLabel(ViewProviderDraftAnnotation): pos = vobj.Object.Placement.Base.add(v) self.textpos.translation.setValue(pos) self.textpos.rotation.setValue(vobj.Object.Placement.Rotation.Q) + + +# Alias for compatibility with v0.18 and earlier +ViewProviderDraftLabel = ViewProviderLabel diff --git a/src/Mod/Draft/draftviewproviders/view_text.py b/src/Mod/Draft/draftviewproviders/view_text.py index 6cb5115dcf..a84f916184 100644 --- a/src/Mod/Draft/draftviewproviders/view_text.py +++ b/src/Mod/Draft/draftviewproviders/view_text.py @@ -43,41 +43,59 @@ class ViewProviderText(ViewProviderDraftAnnotation): def __init__(self,vobj): - super(ViewProviderText, self).__init__(vobj) self.set_properties(vobj) - self.Object = vobj.Object vobj.Proxy = self - def set_properties(self, vobj): + """Set the properties only if they don't already exist.""" + super(ViewProviderText, self).set_properties(vobj) + properties = vobj.PropertiesList - vobj.addProperty("App::PropertyLength","FontSize", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The size of the text")) - vobj.addProperty("App::PropertyFont","FontName", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The font of the text")) - vobj.addProperty("App::PropertyEnumeration","Justification", - "Text",QT_TRANSLATE_NOOP("App::Property", - "The vertical alignment of the text")) - vobj.addProperty("App::PropertyColor","TextColor", - "Text",QT_TRANSLATE_NOOP("App::Property", - "Text color")) - vobj.addProperty("App::PropertyFloat","LineSpacing", - "Text",QT_TRANSLATE_NOOP("App::Property", - "Line spacing (relative to font size)")) + if "FontSize" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The size of the text") + vobj.addProperty("App::PropertyLength", + "FontSize", + "Text", + _tip) + vobj.FontSize = utils.get_param("textheight", 1) - param = App.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft") - annotation_scale = param.GetFloat("DraftAnnotationScale", 1.0) - vobj.ScaleMultiplier = 1 / annotation_scale + if "FontName" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The font of the text") + vobj.addProperty("App::PropertyFont", + "FontName", + "Text", + _tip) + vobj.FontName = utils.get_param("textfont", "sans") - vobj.Justification = ["Left","Center","Right"] - vobj.FontName = utils.get_param("textfont","sans") - vobj.FontSize = utils.get_param("textheight",1) + if "Justification" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "The vertical alignment of the text") + vobj.addProperty("App::PropertyEnumeration", + "Justification", + "Text", + _tip) + vobj.Justification = ["Left", "Center", "Right"] + if "TextColor" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Text color") + vobj.addProperty("App::PropertyColor", + "TextColor", + "Text", + _tip) + + if "LineSpacing" not in properties: + _tip = QT_TRANSLATE_NOOP("App::Property", + "Line spacing (relative to font size)") + vobj.addProperty("App::PropertyFloat", + "LineSpacing", + "Text", + _tip) def getIcon(self): return ":/icons/Draft_Text.svg"