Changeset 425
- Timestamp:
- Fri Jun 6 13:42:29 2008
- Files:
-
- ganttpv/trunk/ORM.py (modified) (diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
ganttpv/trunk/ORM.py
r424 r425 60 60 # 080605 - Will add and connect Role and Subtype constraints 61 61 # 080605 - Alex - workaround for bug in GetPixel on MacOSX; moved rolebox connector logic into the fact shape; replaced ctrl-click with cmd-click on Mac 62 # 080606 - Brian - display constraint symbols, connect correctly to adjacent pairs of roles 62 63 63 64 import wx … … 1255 1256 pass 1256 1257 elif shape_type == 'ORMConstraintShape': 1257 pass1258 model['Operator'] = 'Unique' # default 1257 1258 elif shape_type == 'ORMSubtypeConstraintShape': 1258 model['Operator'] = 'Exclusive' 1259 model['Operator'] = 'Exclusive' # default 1258 1259 model['Table'] = object_type 1259 1260 object_id = Data.Update(model)['ID'] … … 2615 2616 dc.SetIdBounds(self.dcid,r) # must set before self.AdjustEnd can be used 2616 2617 2617 if 0: # inclusive 2618 # ['', 'Ring', 'Value'] 2619 2620 if orm_object.Operator in ('InclusiveOr', 'ExclusiveOr'): # inclusive 2618 2621 dc.SetBrush(self.canvas.CachedBrush('Black')) 2619 2622 dc.DrawCircle(x,y,box_w/4) 2620 2623 2621 if 1: # exclusive2624 if orm_object.Operator in ('Exclusion', 'ExclusiveOr'): # exclusive 2621 2624 xx, yy = self.AdjustEnd((box_x, box_y)) 2622 2625 adjx = x - xx - 2 … … 2626 2629 dc.DrawLine(x-adjx, y+adjy, x+adjx+1, y-adjy-1) 2627 2630 2628 if 0: # external unique2631 elif orm_object.Operator == 'Unique': # external unique 2628 2631 dc.DrawLine(x-box_w/2, y, x+box_w/2, y) 2629 2632 2630 if 0: # external prefered unique2633 elif orm_object.Operator == 'Preferred': # external prefered unique 2630 2633 dc.DrawLine(x-box_w/2, y-1, x+box_w/2, y-1) 2631 2634 dc.DrawLine(x-box_w/2, y+1, x+box_w/2, y+1) 2632 2635 2633 if 0: # equal2636 elif orm_object.Operator == 'Equality': # equal 2633 2636 dc.DrawLine(x-box_w/2+4, y-2, x+box_w/2-4, y-2) 2634 2637 dc.DrawLine(x-box_w/2+4, y+1, x+box_w/2-4, y+1) 2635 2638 2636 if 0: # subset 2637 # arc doesn't work because it draws the diameter line 2638 # spline doesn't work because it isn't implemented by pseudo dc 2639 elif orm_object.Operator == 'Subset': # subset 2639 2640 left = x-box_w/2+6 2640 2641 right = x+box_w/2-4 2641 2642 gap = 2 2642 2643 dc.DrawLine(left, y-gap*2, right, y-gap*2) 2644 2645 # arc doesn't work because it draws the diameter line 2646 # spline doesn't work because it isn't implemented by pseudo dc 2647 dc.DrawLine(left, y-gap*2, left, y-gap) 2643 2648 # dc.DrawArc(left, y-gap*2, left, y, left, y-gap) 2644 2649 # dc.DrawSpline([wx.Point(left, y-gap*2), wx.Point(left-3, y-gap), wx.Point(left, y)]) 2650 2645 2651 dc.DrawLine(left, y, right, y) 2646 2652 dc.DrawLine(x-box_w/2+4, y+2, right, y+2) … … 2864 2870 orm_object = self.Get('Target') 2865 2871 x, y = self.GetPos() 2866 nodea = self.Get('NodeA') 2872 nodea = self.Get('NodeA') # these objects might not already be in the diagram 2866 2872 nodeb = self.Get('NodeB') 2867 2873 … … 2870 2876 if not orm_object: return # object has probably been undone 2871 2877 dc.SetId(self.dcid) 2878 2879 constraintlist = self.Get('Target') 2880 cr_list = constraintlist.GetList('ORMConstraintRole') 2881 # remove constraint roles that aren't for this fact 2882 fact_roles = [ cr for cr in cr_list if cr.ORMRole.ORMFactTypeID == nodea.Target.ID ] 2883 if len(fact_roles) == 0: 2884 seq = 1 2885 elif len(fact_roles) == 1: 2886 role = fact_roles[0].ORMRole 2887 seq = role.Seq or 1 2888 elif (len(fact_roles) == 2 2889 and abs(fact_roles[0].ORMRole.Seq - fact_roles[1].ORMRole.Seq) == 1): 2890 seq = float(fact_roles[0].ORMRole.Seq + fact_roles[1].ORMRole.Seq)/2 2891 else: # much more complicated (but do it later) 2892 role = fact_roles[0].ORMRole 2893 seq = role.Seq or 1 2872 2894 2873 enda = nodea.GetPos() 2874 endb = nodeb.AdjustEnd(enda, seq=0) 2875 enda = nodea.AdjustEnd(endb) 2895 endb = nodeb.GetPos() 2896 enda = nodea.AdjustEnd(endb, seq) 2897 endb = nodeb.AdjustEnd(enda) 2876 2898 2877 2899 minx = min(enda[0], endb[0]) … … 2883 2905 box_h = maxy - miny + 6 2884 2906 2885 pen = self.canvas.CachedPen( 1, 1, wx.SOLID)2907 pen = self.canvas.CachedPen(0, 1, wx.SOLID) 2885 2907 dc.SetPen(pen) 2886 2908 dc.DrawLine(enda[0], enda[1], endb[0], endb[1]) … … 3161 3183 def ConstraintMenu(self, constraint, menu): 3162 3184 if self.rolelist: 3163 menu.Append(self.popsID2 1, "Add Role List")3185 menu.Append(self.popsID20, "Add Role List") 3163 3185 menu.AppendSeparator() 3164 menu.AppendRadioItem(self.popsID22, "Set as Unique") 3165 menu.Check(self.popsID22, (constraint.Operator == 'Unique')) 3186 menu.AppendRadioItem(self.popsID21, "Set as Unique") 3187 menu.Check(self.popsID21, (constraint.Operator == 'Unique')) 3188 menu.AppendRadioItem(self.popsID22, "Set as Preferred") 3189 menu.Check(self.popsID22, (constraint.Operator == 'Preferred')) 3166 3190 menu.AppendRadioItem(self.popsID23, "Set as InclusiveOr") 3167 3191 menu.Check(self.popsID23, (constraint.Operator == 'InclusiveOr')) … … 3170 3194 menu.Check(self.popsID24, (constraint.Operator == 'Subset')) 3171 3195 menu.AppendRadioItem(self.popsID25, "Set as Equality") 3172 menu.Check(self.popsID2 4, (constraint.Operator == 'Equality'))3196 menu.Check(self.popsID25, (constraint.Operator == 'Equality')) 3172 3196 menu.AppendRadioItem(self.popsID26, "Set as Exclusion") 3173 menu.Check(self.popsID2 4, (constraint.Operator == 'Exclusion'))3197 menu.Check(self.popsID26, (constraint.Operator == 'Exclusion')) 3173 3197 menu.AppendRadioItem(self.popsID27, "Set as ExclusiveOr") 3174 menu.Check(self.popsID24, (constraint.Operator == 'ExclusiveOr')) 3175 menu.AppendRadioItem(self.popsID28, "Set as Value") 3176 menu.Check(self.popsID24, (constraint.Operator == 'Value')) 3177 menu.AppendRadioItem(self.popsID29, "Set as Ring") 3178 menu.Check(self.popsID24, (constraint.Operator == 'Ring')) 3179 menu.AppendSeparator() 3198 menu.Check(self.popsID27, (constraint.Operator == 'ExclusiveOr')) 3199 menu.AppendRadioItem(self.popsID28, "Set as Value (not implemented)") 3200 menu.Check(self.popsID28, (constraint.Operator == 'Value')) 3201 menu.AppendRadioItem(self.popsID29, "Set as Ring (not implemented)") 3202 menu.Check(self.popsID29, (constraint.Operator == 'Ring')) 3180 3203 count = len(constraint.GetList('ORMConstraintList')) 3181 3204 if count > 0: 3205 menu.AppendSeparator() 3182 3206 menu.Append(self.popsID41, "Delete Role List 1") 3183 3207 if count > 1: … … 3189 3213 if count > 3: 3190 3214 menu.Append(self.popsID44, "Delete Role List 4") 3215 if count > 4: 3216 menu.Append(self.popsID44, "Delete Role List 4") 3191 3217 3192 3218 def SubtypeConstraintMenu(self, constraint, menu): 3193 menu.AppendRadioItem(self.popsID31, "Set as Exclusive") 3194 menu.Check(self.popsID31, (constraint.Operator == 'Exclusive')) 3195 menu.AppendRadioItem(self.popsID32, "Set as Total") 3196 menu.Check(self.popsID32, (constraint.Operator == 'Total')) 3197 menu.AppendRadioItem(self.popsID33, "Set as Partition") 3198 menu.Check(self.popsID33, (constraint.Operator == 'Partition')) 3219 menu.AppendRadioItem(self.popsID51, "Set as Exclusive") 3220 menu.Check(self.popsID51, (constraint.Operator == 'Exclusive')) 3221 menu.AppendRadioItem(self.popsID52, "Set as Total") 3222 menu.Check(self.popsID52, (constraint.Operator == 'Total')) 3223 menu.AppendRadioItem(self.popsID53, "Set as Partition") 3224 menu.Check(self.popsID53, (constraint.Operator == 'Partition')) 3199 3225 3200 3226 def OnContextMenuShape(self, event): … … 3226 3252 self.popsID17 = wx.NewId() 3227 3253 self.popsID18 = wx.NewId() 3254 self.popsID20 = wx.NewId() 3228 3255 self.popsID21 = wx.NewId() 3229 3256 self.popsID22 = wx.NewId() … … 3235 3262 self.popsID28 = wx.NewId() 3236 3263 self.popsID29 = wx.NewId() 3237 self.popsID31 = wx.NewId()3238 self.popsID32 = wx.NewId()3239 self.popsID33 = wx.NewId()3240 3264 self.popsID41 = wx.NewId() 3241 3265 self.popsID42 = wx.NewId() 3242 3266 self.popsID43 = wx.NewId() 3243 3267 self.popsID44 = wx.NewId() 3268 self.popsID51 = wx.NewId() 3269 self.popsID52 = wx.NewId() 3270 self.popsID53 = wx.NewId() 3244 3271 3245 3272 self.Bind(wx.EVT_MENU, self.OnPops01, id=self.popsID01) … … 3260 3287 self.Bind(wx.EVT_MENU, self.OnPops17, id=self.popsID17) 3261 3288 self.Bind(wx.EVT_MENU, self.OnPops18, id=self.popsID18) 3289 self.Bind(wx.EVT_MENU, self.OnPops20, id=self.popsID20) 3262 3290 self.Bind(wx.EVT_MENU, self.OnPops21, id=self.popsID21) 3263 3291 self.Bind(wx.EVT_MENU, self.OnPops22, id=self.popsID22) … … 3265 3293 self.Bind(wx.EVT_MENU, self.OnPops24, id=self.popsID24) 3266 3294 self.Bind(wx.EVT_MENU, self.OnPops25, id=self.popsID25) 3267 self.Bind(wx.EVT_MENU, self.OnPops25, id=self.popsID26) 3268 self.Bind(wx.EVT_MENU, self.OnPops25, id=self.popsID27) 3269 self.Bind(wx.EVT_MENU, self.OnPops25, id=self.popsID28) 3270 self.Bind(wx.EVT_MENU, self.OnPops25, id=self.popsID29) 3271 self.Bind(wx.EVT_MENU, self.OnPops31, id=self.popsID31) 3272 self.Bind(wx.EVT_MENU, self.OnPops32, id=self.popsID32) 3273 self.Bind(wx.EVT_MENU, self.OnPops33, id=self.popsID33) 3274 self.Bind(wx.EVT_MENU, self.OnPops33, id=self.popsID41) 3275 self.Bind(wx.EVT_MENU, self.OnPops33, id=self.popsID42) 3276 self.Bind(wx.EVT_MENU, self.OnPops33, id=self.popsID43) 3277 self.Bind(wx.EVT_MENU, self.OnPops33, id=self.popsID44) 3295 self.Bind(wx.EVT_MENU, self.OnPops26, id=self.popsID26) 3296 self.Bind(wx.EVT_MENU, self.OnPops27, id=self.popsID27) 3297 self.Bind(wx.EVT_MENU, self.OnPops28, id=self.popsID28) 3298 self.Bind(wx.EVT_MENU, self.OnPops29, id=self.popsID29) 3299 self.Bind(wx.EVT_MENU, self.OnPops41, id=self.popsID41) 3300 self.Bind(wx.EVT_MENU, self.OnPops42, id=self.popsID42) 3301 self.Bind(wx.EVT_MENU, self.OnPops43, id=self.popsID43) 3302 self.Bind(wx.EVT_MENU, self.OnPops44, id=self.popsID44) 3303 self.Bind(wx.EVT_MENU, self.OnPops51, id=self.popsID51) 3304 self.Bind(wx.EVT_MENU, self.OnPops52, id=self.popsID52) 3305 self.Bind(wx.EVT_MENU, self.OnPops53, id=self.popsID53) 3278 3306 3279 3307 # make a menu … … 3516 3544 self.RoleUniqueOther(event, None, 'Set Other Roles as Not Unique') 3517 3545 3518 def OnPops2 1(self, event):3546 def OnPops20(self, event): 3518 3546 if not self.rolelist: return # ignore command of not roles have been selected 3519 3547 l = self.pdc.FindObjects(self.popupx, self.popupy, hitradius) … … 3541 3569 print factshape.Target.ID, factshape.Target.ID in fact_type_ids 3542 3570 if factshape.Target.ID in fact_type_ids: 3543 new_shape = self.AddConnector('ORMConstraintConnectorShape', shape, factshape)3571 new_shape = self.AddConnector('ORMConstraintConnectorShape', factshape, shape) 3543 3571 new_shape.TableName = clist.Table # so 'Target' will work 3544 3572 new_shape.TableID = clist.ID 3545 3573 new_shape.ORMConstraintListID = clist.ID 3546 3574 self.RedrawID(factshape.dcid) 3575 self.RedrawID(new_shape.dcid) 3547 3576 3548 3577 ## self.ClearSelection() … … 3555 3584 ## self.RedrawID(x.dcid) 3556 3585 3586 def SetRoleConstraint(self, event, new_value, undo_msg): 3587 l = self.pdc.FindObjects(self.popupx, self.popupy, hitradius) 3588 if l: 3589 shape = self.dcid_to_shape_xref.get(l[0]) 3590 target = shape.Get('Target') 3591 target.Operator = new_value 3592 Data.SetUndo(undo_msg) 3593 self.RedrawID(shape.dcid) 3594 3595 def OnPops21(self, event): 3596 s = 'Unique' 3597 self.SetRoleConstraint(event, s, 'Undo ' + s) 3557 3598 def OnPops22(self, event): 3558 pass 3599 s = 'Preferred' 3600 self.SetRoleConstraint(event, s, 'Undo ' + s) 3559 3601 def OnPops23(self, event): 3560 pass 3602 s = 'InclusiveOr' 3603 self.SetRoleConstraint(event, s, 'Undo ' + s) 3561 3604 def OnPops24(self, event): 3562 pass 3605 s = 'Subset' 3606 self.SetRoleConstraint(event, s, 'Undo ' + s) 3563 3607 def OnPops25(self, event): 3564 pass 3608 s = 'Equality' 3609 self.SetRoleConstraint(event, s, 'Undo ' + s) 3565 3610 def OnPops26(self, event): 3566 pass 3611 s = 'Exclusion' 3612 self.SetRoleConstraint(event, s, 'Undo ' + s) 3567 3613 def OnPops27(self, event): 3568 pass 3614 s = 'ExclusiveOr' 3615 self.SetRoleConstraint(event, s, 'Undo ' + s) 3616 # - Operator ['Ring', 'Value'] 3569 3617 def OnPops28(self, event): 3570 pass 3618 s = 'n/a' 3619 self.SetRoleConstraint(event, s, 'Undo ' + s) 3571 3620 def OnPops29(self, event): 3572 pass 3621 s = 'n/a' 3622 self.SetRoleConstraint(event, s, 'Undo ' + s) 3573 3623 3574 3624 def OnPops41(self, event): … … 3590 3640 self.RedrawID(shape.dcid) 3591 3641 3592 def OnPops 31(self, event):3642 def OnPops51(self, event): 3592 3642 self.SubtypeConstraintOperator(event, 'Exclusive', 'Set Exclusive') 3593 3643 3594 def OnPops 32(self, event):3644 def OnPops52(self, event): 3594 3644 self.SubtypeConstraintOperator(event, 'Total', 'Set Total') 3595 3645 3596 def OnPops 33(self, event):3646 def OnPops53(self, event): 3596 3646 self.SubtypeConstraintOperator(event, 'Partition', 'Set Partition') 3597 3647
