Changeset 418

Show
Ignore:
Timestamp:
Wed Jun 4 16:26:35 2008
Author:
Brian
Message:

Alternative to 'get()' in object api. Added n-1 span uniqueness constraints. (Thanks Alex for making this much better than it would otherwise have been.)

Files:

Legend:

Unmodified
Added
Removed
Modified
  • ganttpv/trunk/ORM.py

    r416 r418  
    2162 2162         roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
    2163 2163         for i in range(len(roles)):  
    2164               if roles[i].Unique:  
      2164             if roles[i].Unique in ('a', 'd'):  
    2164 2164                 role_unique = True  
    2165 2165                 if roles[i].Unique == 'a':  
     
    2175 2175                 dc.DrawLine(x0, y0, x1, y1)  
    2176 2176  
    2177           if not role_unique and orm_object.Unique:  
      2177         role_spans = 0  
      2178         y0 = y  
      2179         if role_unique: y0 -= 2  
      2180         y1 = y0  
      2181         for i in range(len(roles)):  
      2182             if roles[i].UniqueOther in ('ax', 'dx'):  
      2183                 role_spans += 1  
      2184                 if roles[i].UniqueOther == 'ax':  
      2185                     pen = self.canvas.CachedPen(3, 1, wx.SOLID)  
      2186                     penx = self.canvas.CachedPen(3, 1, wx.DOT)  
      2187                 else:  # 'dx'  
      2188                     pen = self.canvas.CachedPen(1, 1, wx.SOLID)  
      2189                     penx = self.canvas.CachedPen(1, 1, wx.DOT)  
      2190                 dc.SetPen(pen)  
      2191                 if i == 0:  
      2192                     x0 = x + role_box_width  
      2193                     x1 = x0 + role_box_width * (len(roles)-1)  
      2194                     dc.DrawLine(x0, y0, x1, y1)  
      2195                 elif i == len(roles)-1:  
      2196                     x0 = x  
      2197                     x1 = x0 + role_box_width * (len(roles)-1)  
      2198                     dc.DrawLine(x0, y0, x1, y1)  
      2199                 else:  
      2200                     x0 = x  
      2201                     x1 = x0 + role_box_width * i  
      2202                     dc.DrawLine(x0, y0, x1, y1)  
      2203  
      2204                     x0 = x1 + 2  # start with a gap     
      2205                     x1 = x0 + role_box_width - 4  # end with gap  
      2206                     dc.SetPen(penx)  
      2207                     dc.DrawLine(x0, y0, x1, y1)  
      2208                      
      2209                     x0 = x1 + 2  # after gap  
      2210                     x1 = x0 + role_box_width * (len(roles)-i-1)  
      2211                     dc.SetPen(pen)  
      2212                     dc.DrawLine(x0, y0, x1, y1)  
      2213                 y0 = y0 - 2  
      2214                 y1 = y0  
      2215  
      2216         if not role_unique and not role_spans and orm_object.Unique:  
    2178 2217             pen = self.canvas.CachedPen(3, 1, wx.SOLID)  
    2179 2218             dc.SetPen(pen)  
     
    2929 2968 # -- code for popup menu on shape  
    2930 2969     def RoleMenu(self, role, menu):  
    2931           if role.Mandatory:  
    2932               menu.Append(self.popsID11, "Role Not Mandatory")  
    2933           if role.Mandatory != 'a':  
    2934               menu.Append(self.popsID12, "Role Mandatory Alethic")  
    2935           if role.Mandatory != 'd':  
    2936               menu.Append(self.popsID13, "Role Mandatory Deontic")  
      2970         if role.ORMFactType.Nary <= 2 or role.Unique == 'a':  
      2971             menu.AppendCheckItem(self.popsID15, "Set Role as Unique")  
      2972             menu.Check(self.popsID15, (role.Unique == 'a'))  
      2973         if role.ORMFactType.Nary > 2:  
      2974             menu.AppendCheckItem(self.popsID16, "Set Other Roles as Unique")  
      2975             menu.Check(self.popsID16, (role.UniqueOther == 'ax'))  
      2976         menu.AppendCheckItem(self.popsID12, "Set Role as Mandatory")  
      2977         menu.Check(self.popsID12, (role.Mandatory == 'a'))  
    2937 2978         menu.AppendSeparator()  
    2938           if role.Unique:  
    2939               menu.Append(self.popsID14, "Role Not Unique")  
    2940           if role.Unique != 'a':  
    2941               menu.Append(self.popsID15, "Role Unique Alethic")  
    2942           if role.Unique != 'd':  
    2943               menu.Append(self.popsID16, "Role Unique Deontic")  
      2979         menu.AppendCheckItem(self.popsID17, "Set Role as Unique (Deontic)")  
      2980         menu.Check(self.popsID17, (role.Unique == 'd'))  
      2981         if role.ORMFactType.Nary > 2:  
      2982             menu.AppendCheckItem(self.popsID18, "Set Other Roles as Unique (Deontic)")  
      2983             menu.Check(self.popsID18, (role.UniqueOther == 'dx'))  
      2984         menu.AppendCheckItem(self.popsID13, "Set Role as Mandatory (Deontic)")  
      2985         menu.Check(self.popsID13, (role.Mandatory == 'd'))  
    2944 2986  
    2945 2987     def OnContextMenuShape(self, event):  
     
    2969 3011             self.popsID15 = wx.NewId()  
    2970 3012             self.popsID16 = wx.NewId()  
      3013             self.popsID17 = wx.NewId()  
      3014             self.popsID18 = wx.NewId()  
    2971 3015  
    2972 3016             self.Bind(wx.EVT_MENU, self.OnPops01, id=self.popsID01)  
     
    2985 3029             self.Bind(wx.EVT_MENU, self.OnPops15, id=self.popsID15)  
    2986 3030             self.Bind(wx.EVT_MENU, self.OnPops16, id=self.popsID16)  
      3031             self.Bind(wx.EVT_MENU, self.OnPops17, id=self.popsID17)  
      3032             self.Bind(wx.EVT_MENU, self.OnPops18, id=self.popsID18)  
    2987 3033  
    2988 3034         # make a menu  
     
    3016 3062             elif shape.Subtype == 'ORMFactTypeShape':  
    3017 3063                 target = shape.Get('Target')  
    3018                   if target.Unique:  
    3019                       change = 'Not Spanning Unique'  
    3020                   else:  
    3021                       change = 'Spanning Unique'  
    3022                   menu.Append(self.popsID02, "Set as %s" % change)  
      3064 ##                if target.Unique:  
      3065 ##                    change = 'Not Spanning Unique'  
      3066 ##                else:  
      3067 ##                    change = 'Spanning Unique'  
      3068                 menu.AppendCheckItem(self.popsID02, "Set as Spanning Unique")  
      3069                 menu.Check(self.popsID02, bool(target.Unique))  
    3023 3070                 if target.Nary == 2:  
    3024 3071                     menu.Append(self.popsID03, "Reverse Role Order")  
     
    3144 3191  
    3145 3192     def OnPops12(self, event):  
    3146           self.RoleMandatory(event, 'a', 'Set Mandatory Alethic')  
      3193         if  event.IsChecked():  
      3194             self.RoleMandatory(event, 'a', 'Set Mandatory')  
      3195         else:  
      3196             self.OnPops11(event)  
    3147 3197  
    3148 3198     def OnPops13(self, event):  
    3149           self.RoleMandatory(event, 'd', 'Set Mandatory Deontic')  
      3199         if event.IsChecked():  
      3200             self.RoleMandatory(event, 'd', 'Set Mandatory (Deontic)')  
      3201         else:  
      3202             self.OnPops11(event)  
    3150 3203  
    3151 3204     def RoleUnique(self, event, new_unique_value, undo_msg):  
     
    3166 3219                 self.RedrawID(shape.Get('NodeA').dcid)  
    3167 3220  
      3221     def RoleUniqueOther(self, event, new_unique_value, undo_msg):  
      3222         l = self.pdc.FindObjects(self.popupx, self.popupy, hitradius)  
      3223         if l:  
      3224             shape = self.dcid_to_shape_xref.get(l[0])  
      3225             if shape.Subtype == 'ORMFactTypeShape':  
      3226                 target = shape.GetRole(self.popupx, self.popupy)  
      3227             else:  # role connector  
      3228                 target = shape.Get('Target')  
      3229             target.UniqueOther = new_unique_value  
      3230             Data.SetUndo(undo_msg)  
      3231             self.RedrawID(shape.dcid)  
      3232             if shape.Subtype == 'ORMFactTypeShape':  
      3233                 for x in shape.GetFollowers():  
      3234                     self.RedrawID(x.dcid)  
      3235             else:  # role  
      3236                 self.RedrawID(shape.Get('NodeA').dcid)  
      3237  
    3168 3238     def OnPops14(self, event):  
    3169 3239         self.RoleUnique(event, None, 'Set Not Unique')  
    3170 3240  
    3171 3241     def OnPops15(self, event):  
    3172           self.RoleUnique(event, 'a', 'Set Unique Alethic')  
      3242         if event.IsChecked():  
      3243             self.RoleUnique(event, 'a', 'Set Unique')  
      3244         else:  
      3245             self.OnPops14(event)  
    3173 3246  
    3174 3247     def OnPops16(self, event):  
    3175           self.RoleUnique(event, 'd', 'Set Unique Deontic')  
      3248         if event.IsChecked():  
      3249             self.RoleUniqueOther(event, 'ax', 'Set Other Roles as Unique')  
      3250         else:  
      3251             self.RoleUniqueOther(event, None, 'Set Other Roles as Not Unique')  
      3252  
      3253     def OnPops17(self, event):  
      3254         if event.IsChecked():  
      3255             self.RoleUnique(event, 'd', 'Set Unique (Deontic)')  
      3256         else:  
      3257             self.OnPops14(event)  
      3258  
      3259     def OnPops18(self, event):  
      3260         if event.IsChecked():  
      3261             self.RoleUniqueOther(event, 'dx', 'Set Other Roles as Unique (Deontic)')  
      3262         else:  
      3263             self.RoleUniqueOther(event, None, 'Set Other Roles as Not Unique')  
    3176 3264  
    3177 3265 # -- end code for popup menu on shape --  
  • ganttpv/trunk/Data.py

    r411 r418  
    103 103 # 080517 - Brian - added object api  
    104 104 # 080602 - Brian - add subtypes to object api  
      105 # 080604 - Brian - simplify return of objects via object api (don't require 'get')  
    105 106  
    106 107 import datetime, calendar  
     
    612 613             return None  
    613 614  
    614           # temporary version  
    615           if name.endswith('IDX'):  # return the object  
    616               return self.Get(name[:-3])  
    617           return rec.get(name)  # any column name  
      615         # if the name didn't refer to a value, maybe an object was intended  
      616         result = rec.get(name)  
      617         if result == None and not name.endswith('ID'):  
      618             return self.Get(name)  # return object  
      619         else:  
      620             return result  # return value  
      621 ##        # temporary version  
      622 ##        if name.endswith('IDX'):  # return the object  
      623 ##            return self.Get(name[:-3])  
      624 ##        return rec.get(name)  # any column name  
    618 625  
    619 626     def __nonzero__(self):  # if object == false if not valid