| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import Path |
| |
|
| | __title__ = "Property type abstraction for editing purposes" |
| | __author__ = "sliptonic (Brad Collette)" |
| | __url__ = "https://www.freecad.org" |
| | __doc__ = "Prototype objects to allow extraction of setup sheet values and editing." |
| |
|
| |
|
| | Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) |
| | |
| |
|
| |
|
| | class Property(object): |
| | """Base class for all prototype properties""" |
| |
|
| | def __init__(self, name, propType, category, info): |
| | self.name = name |
| | self.propType = propType |
| | self.category = category |
| | self.info = info |
| | self.editorMode = 0 |
| | self.value = None |
| |
|
| | def setValue(self, value): |
| | self.value = value |
| |
|
| | def getValue(self): |
| | return self.value |
| |
|
| | def setEditorMode(self, mode): |
| | self.editorMode = mode |
| |
|
| | def displayString(self): |
| | if self.value is None: |
| | t = self.typeString() |
| | p = "an" if t[0] in ["A", "E", "I", "O", "U"] else "a" |
| | return "%s %s" % (p, t) |
| | return self.value |
| |
|
| | def typeString(self): |
| | return "Property" |
| |
|
| | def setupProperty(self, obj, name, category, value): |
| | created = False |
| | if not hasattr(obj, name): |
| | obj.addProperty(self.propType, name, category, self.info) |
| | self.initProperty(obj, name) |
| | created = True |
| | setattr(obj, name, value) |
| | return created |
| |
|
| | def initProperty(self, obj, name): |
| | pass |
| |
|
| | def setValueFromString(self, string): |
| | self.setValue(self.valueFromString(string)) |
| |
|
| | def valueFromString(self, string): |
| | return string |
| |
|
| |
|
| | class PropertyEnumeration(Property): |
| | def typeString(self): |
| | return "Enumeration" |
| |
|
| | def setValue(self, value): |
| | if list == type(value): |
| | self.enums = value |
| | else: |
| | super(PropertyEnumeration, self).setValue(value) |
| |
|
| | def getEnumValues(self): |
| | return self.enums |
| |
|
| | def initProperty(self, obj, name): |
| | setattr(obj, name, self.enums) |
| |
|
| |
|
| | class PropertyQuantity(Property): |
| | def displayString(self): |
| | if self.value is None: |
| | return Property.displayString(self) |
| | return self.value.getUserPreferred()[0] |
| |
|
| |
|
| | class PropertyAngle(PropertyQuantity): |
| | def typeString(self): |
| | return "Angle" |
| |
|
| |
|
| | class PropertyDistance(PropertyQuantity): |
| | def typeString(self): |
| | return "Distance" |
| |
|
| |
|
| | class PropertyLength(PropertyQuantity): |
| | def typeString(self): |
| | return "Length" |
| |
|
| |
|
| | class PropertyPercent(Property): |
| | def typeString(self): |
| | return "Percent" |
| |
|
| |
|
| | class PropertyFloat(Property): |
| | def typeString(self): |
| | return "Float" |
| |
|
| | def valueFromString(self, string): |
| | return float(string) |
| |
|
| |
|
| | class PropertyInteger(Property): |
| | def typeString(self): |
| | return "Integer" |
| |
|
| | def valueFromString(self, string): |
| | return int(string) |
| |
|
| |
|
| | class PropertyBool(Property): |
| | def typeString(self): |
| | return "Bool" |
| |
|
| | def valueFromString(self, string): |
| | return bool(string) |
| |
|
| |
|
| | class PropertyString(Property): |
| | def typeString(self): |
| | return "String" |
| |
|
| |
|
| | class PropertyMap(Property): |
| | def typeString(self): |
| | return "Map" |
| |
|
| | def displayString(self, value): |
| | return str(value) |
| |
|
| |
|
| | class OpPrototype(object): |
| |
|
| | PropertyType = { |
| | "App::PropertyAngle": PropertyAngle, |
| | "App::PropertyBool": PropertyBool, |
| | "App::PropertyDistance": PropertyDistance, |
| | "App::PropertyEnumeration": PropertyEnumeration, |
| | "App::PropertyFile": PropertyString, |
| | "App::PropertyFloat": PropertyFloat, |
| | "App::PropertyFloatConstraint": Property, |
| | "App::PropertyFloatList": Property, |
| | "App::PropertyInteger": PropertyInteger, |
| | "App::PropertyIntegerList": PropertyInteger, |
| | "App::PropertyLength": PropertyLength, |
| | "App::PropertyLink": Property, |
| | "App::PropertyLinkList": Property, |
| | "App::PropertyLinkSubListGlobal": Property, |
| | "App::PropertyMap": PropertyMap, |
| | "App::PropertyPercent": PropertyPercent, |
| | "App::PropertyString": PropertyString, |
| | "App::PropertyStringList": Property, |
| | "App::PropertyVectorDistance": Property, |
| | "App::PropertyVectorList": Property, |
| | "Part::PropertyPartShape": Property, |
| | } |
| |
|
| | def __init__(self, name): |
| | self.Label = name |
| | self.properties = {} |
| | self.DoNotSetDefaultValues = True |
| | self.Proxy = None |
| |
|
| | def __setattr__(self, name, val): |
| | if name in ["Label", "DoNotSetDefaultValues", "properties", "Proxy"]: |
| | if name == "Proxy": |
| | val = None |
| | return super(OpPrototype, self).__setattr__(name, val) |
| | self.properties[name].setValue(val) |
| |
|
| | def addProperty(self, typeString, name, category, info=None): |
| | prop = self.PropertyType[typeString](name, typeString, category, info) |
| | self.properties[name] = prop |
| | return self |
| |
|
| | def setEditorMode(self, name, mode): |
| | self.properties[name].setEditorMode(mode) |
| |
|
| | def getProperty(self, name): |
| | return self.properties[name] |
| |
|
| | def setupProperties(self, setup): |
| | return [p for p in self.properties if p.name in setup] |
| |
|