diff --git a/src/Mod/Spreadsheet/Spreadsheet.py b/src/Mod/Spreadsheet/Spreadsheet.py index 1b28f9948a..0eac9d4a9d 100644 --- a/src/Mod/Spreadsheet/Spreadsheet.py +++ b/src/Mod/Spreadsheet/Spreadsheet.py @@ -246,7 +246,7 @@ class Spreadsheet: if not r in self.rows: self.rows.append(r) self.rows.sort() - self.updateControlledProperties(key) + self._updateControllers() else: self.__dict__.__setitem__(key,value) @@ -312,6 +312,18 @@ class Spreadsheet: else: self._relations[a] = [key] + def _updateControllers(self): + "triggers the property controllers" + if hasattr(self,"Object"): + obj = FreeCAD.ActiveDocument.getObject(self.Object) + if obj: + import Draft + if Draft.getType(obj) == "Spreadsheet": + if hasattr(obj,"Controllers"): + for co in obj.Controllers: + if Draft.getType(co) == "SpreadsheetPropertyController": + co.Proxy.execute(co) + def execute(self,obj): self.setControlledCells(obj) @@ -455,32 +467,6 @@ class Spreadsheet: cells.append(co.Cell.lower()) return cells - def updateControlledProperties(self,key): - "updates the properties of controlled objects" - if hasattr(self,"Object"): - obj = FreeCAD.ActiveDocument.getObject(self.Object) - if obj: - import Draft - if Draft.getType(obj) == "Spreadsheet": - if hasattr(obj,"Controllers"): - for co in obj.Controllers: - if Draft.getType(co) == "SpreadsheetPropertyController": - if co.Cell.upper() == key.upper(): - if co.TargetObject and co.TargetProperty: - b = co.TargetObject - props = co.TargetProperty.split(".") - for p in props: - if hasattr(b,p): - if p != props[-1]: - b = getattr(b,p) - else: - return - try: - setattr(b,p,self._cells[key]) - if DEBUG: print "setting property ",co.TargetProperty, " of object ",co.TargetObject.Name, " to ",self._cells[key] - except: - if DEBUG: print "unable to set property ",co.TargetProperty, " of object ",co.TargetObject.Name, " to ",self._cells[key] - class ViewProviderSpreadsheet(object): def __init__(self, vobj): @@ -644,16 +630,47 @@ class SpreadsheetPropertyController: def __init__(self,obj): obj.Proxy = self self.Type = "SpreadsheetPropertyController" + obj.addProperty("App::PropertyEnumeration","TargetType","Base","The type of item to control") obj.addProperty("App::PropertyLink","TargetObject","Base","The object that must be controlled") - obj.addProperty("App::PropertyString","TargetProperty","Base","The property of the target object to control") + obj.addProperty("App::PropertyString","TargetProperty","Base","The property or constraint of the target object to control") obj.addProperty("App::PropertyString","Cell","Base","The cell that contains the value to apply to the property") + obj.TargetType = ["Property","Constraint"] def execute(self,obj): if obj.Cell and obj.TargetObject and obj.TargetProperty and obj.InList: sp = obj.InList[0] import Draft if Draft.getType(sp) == "Spreadsheet": - sp.Proxy.updateControlledProperties(obj.Cell) + try: + value = getattr(sp.Proxy,obj.Cell) + except: + if DEBUG: print "No value for cell ",obj.Cell," in spreadsheet." + return + if obj.TargetType == "Property": + b = obj.TargetObject + props = obj.TargetProperty.split(".") + for p in props: + if hasattr(b,p): + if p != props[-1]: + b = getattr(b,p) + else: + return + try: + setattr(b,p,value) + if DEBUG: print "setting property ",obj.TargetProperty, " of object ",obj.TargetObject.Name, " to ",value + except: + if DEBUG: print "unable to set property ",obj.TargetProperty, " of object ",obj.TargetObject.Name, " to ",value + else: + if Draft.getType(obj.TargetObject) == "Sketch": + if obj.TargetProperty.isdigit(): + try: + c = int(obj.TargetProperty) + obj.TargetObject.setDatum(c,float(value)) + FreeCAD.ActiveDocument.recompute() + if DEBUG: print "setting constraint ",obj.TargetProperty, " of object ",obj.TargetObject.Name, " to ",value + except: + if DEBUG: print "unable to set constraint ",obj.TargetProperty, " of object ",obj.TargetObject.Name, " to ",value + def __getstate__(self): return self.Type