Changeset 425

Show
Ignore:
Timestamp:
Fri Jun 6 13:42:29 2008
Author:
Brian
Message:

Display constraint symbols; connect correctly to adjacent pairs of roles

Files:

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           pass  
      1258         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:  # exclusive  
      2624         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 unique  
      2631         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 unique  
      2633         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:  # equal  
      2636         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.popsID21, "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.popsID24, (constraint.Operator == 'Equality'))  
      3196         menu.Check(self.popsID25, (constraint.Operator == 'Equality'))  
    3172 3196         menu.AppendRadioItem(self.popsID26, "Set as Exclusion")  
    3173           menu.Check(self.popsID24, (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 OnPops21(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 OnPops31(self, event):  
      3642     def OnPops51(self, event):  
    3592 3642         self.SubtypeConstraintOperator(event, 'Exclusive', 'Set Exclusive')  
    3593 3643  
    3594       def OnPops32(self, event):  
      3644     def OnPops52(self, event):  
    3594 3644         self.SubtypeConstraintOperator(event, 'Total', 'Set Total')  
    3595 3645  
    3596       def OnPops33(self, event):  
      3646     def OnPops53(self, event):  
    3596 3646         self.SubtypeConstraintOperator(event, 'Partition', 'Set Partition')  
    3597 3647