Changeset 436

Show
Ignore:
Timestamp:
Sun Jun 8 17:20:50 2008
Author:
Brian
Message:

Display fact type roles using the reading's role sequence, not the fact type's role sequence

Files:

Legend:

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

    r434 r436  
    1285 1285         fact.Nary += 1  
    1286 1286         model['Seq'] = fact.Nary  
    1287           object_type = 'ORMRole'  #  
      1287         object_type = 'ORMRole'  
    1287 1287     elif shape_type == 'ORMSubtypeConnectorShape':  # what should this be called?  
    1288 1288         model['ORMSubtypeID'] = nodeb.TableID  
     
    1295 1295     model['Table'] = object_type  
    1296 1296     object_id = Data.Update(model)['ID']  
      1297     if shape_type == 'ORMRoleConnectorShape':  
      1298         AddRole(fact, fact.db.GetObject('ORMRole', object_id))  
    1297 1299  
    1298 1300     graphic = {'Table': 'GraphicObject', 'ProjectID': projectid, 'ReportID': report_object.ID,  
     
    1331 1333 ##    object_id = Data.Update(model)['ID']  
    1332 1334     if shape_type == 'ORMFactReadingShape':  
      1335         model2 = {'Table': 'ORMRoleSequence', 'Seq': 1,  
      1336                  'ProjectID': projectid, 'DateAdded': today}  
      1337         role_seq_id = Data.Update(model2)['ID']  
      1338         model['ORMRoleSequenceID'] = role_seq_id  
      1339  
    1333 1340         object_id = Data.Update(model)['ID']  
    1334           nodea.Get('Target').ORMFactReadingID = object_id  # pointer back  
      1341         nodea.Target.ORMFactReadingID = object_id  # pointer back  
      1342          
    1335 1343     elif shape_type == 'ORMRoleNameShape':  # is this really needed  
    1336 1344         object_type = 'ORMRole'  
     
    2217 2225 class ORMFactTypeShape(ORMBox):  
    2218 2226     def AdjustEnd(self, other_end, seq=None):  
    2219           nary = self.Get('Target').Nary  
      2227         fact_object = self.Target  
      2228         reading_object = self.Target.ORMFactReading  
      2229         # I'm not sure whether the fact shape should point to the fact shape or the fact  
      2230         # reading. I've added these two definitions to each method to make it easier  
      2231         # to convert to pointing at the reading.  
      2232  
      2233         nary = fact_object.Nary  
    2220 2234         if not seq:  
    2221 2235             seq = (nary + 1) / 2.0  
     
    2238 2252  
    2239 2253     def GetCenter(self):  
      2254         fact_object = self.Target  
      2255         reading_object = self.Target.ORMFactType  
      2256  
    2240 2257         x, y = self.GetPos()  
    2241 2258         y += role_box_height // 2  
    2242           x += role_box_width * self.Target.Nary // 2  
      2259         x += role_box_width * fact_object.Nary // 2  
    2242 2259         return x, y  
    2243 2260  
    2244 2261     def Draw(self, dc):  
    2245           orm_object = self.Get('Target')  
      2262         fact_object = self.Target  
      2263         reading_object = self.Target.ORMFactReading  
      2264  
    2246 2265         dc.ClearId(self.dcid)  
    2247           if not orm_object: return  # object has probably been undone  
      2266         if not fact_object or not reading_object: return  # object has probably been undone  
    2247 2266         dc.SetId(self.dcid)  
    2248 2267  
     
    2255 2274         prior_r = self.canvas.pdc.GetIdBounds(self.dcid)  
    2256 2275         if debug: print "prior rectangle", prior_r  
    2257           nary = orm_object.Nary or 1  
      2276         nary = fact_object.Nary or 1  
    2257 2276 ##        role_box_height = 8 # 12  
    2258 2277 ##        role_box_width = 12 # 12  
     
    2280 2299         role_unique = False  
    2281 2300         role_unique_alethic = False  
    2282           roles = orm_object.GetList('ORMRole')  
      2301         # roles = fact_object.GetList('ORMRole')  
      2302         roles = reading_object.ORMRoleSequence.GetList('ORMRolePosition')  
    2283 2303         roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
    2284 2304         for i, r in enumerate(roles):  
    2285 2305 ##            print 'role', r  
    2286 2306 ##            print 'rolelist', self.canvas.rolelist  
    2287               if r in self.canvas.rolelist:      # selection numbers to put in role boxes  
    2288                   seq = self.canvas.rolelist.index(r)  
      2307             if r.ORMRole in self.canvas.rolelist:      # selection numbers to put in role boxes  
      2308                 seq = self.canvas.rolelist.index(r.ORMRole)  
    2289 2309                 dc.SetFont(self.canvas.GetFont())  
    2290 2310                 dc.SetTextForeground('Black')  
     
    2293 2313                 dc.DrawText(str(seq+1), x + offsetx, y)  
    2294 2314  
    2295               if roles[i].Unique in ('a', 'd'):    # role unique bars  
      2315             if roles[i].ORMRole.Unique in ('a', 'd'):    # role unique bars  
    2295 2315                 role_unique = True  
    2296                   if roles[i].Unique == 'a':  
      2316                 if roles[i].ORMRole.Unique == 'a':  
    2296 2316                     role_unique_alethic = True  
    2297 2317                     pen = self.canvas.CachedPen(3, 1, wx.SOLID)  
     
    2312 2332         y1 = y0  
    2313 2333         for i in range(len(roles)):  
    2314               if roles[i].UniqueOther in ('ax', 'dx'):  
    2315                   if roles[i].UniqueOther == 'ax':  
      2334             if roles[i].ORMRole.UniqueOther in ('ax', 'dx'):  
      2335                 if roles[i].ORMRole.UniqueOther == 'ax':  
    2316 2336                     role_spans += 1  
    2317 2337                     pen = self.canvas.CachedPen(3, 1, wx.SOLID)  
     
    2346 2366                 y1 = y0  
    2347 2367  
    2348           if not role_unique_alethic and not role_spans and orm_object.Unique:  
      2368         if not role_unique_alethic and not role_spans and fact_object.Unique:  
    2348 2368             pen = self.canvas.CachedPen(3, 1, wx.SOLID)  
    2349 2369             dc.SetPen(pen)  
     
    2364 2384     def Char(self, char):  
    2365 2385         # if no reading object, create one  
    2366            
    2367           orm_object = self.Get('Target')  
      2386         fact_object = self.Target  
      2387         reading_object = self.Target.ORMFactReading  
      2388  
    2368 2389         if char in ('+', '*'):  
    2369               if orm_object.Derived == char:  
    2370                   orm_object.Derived = ''  
      2390             if fact_object.Derived == char:  
      2391                 fact_object.Derived = ''  
    2371 2392             else:  
    2372                   orm_object.Derived = char  
      2393                 fact_object.Derived = char  
    2372 2393             return  
    2373 2394  
    2374           orm_object = orm_object.Get('ORMFactReading')  
    2375           if orm_object.Reading:  
      2395         if reading_object.Reading:  
    2376 2396             if char == '\x08':  # this is for windows, cross platform?  
    2377                   orm_object.Reading = orm_object.Reading[:-1]  
      2397                 reading_object.Reading = reading_object.Reading[:-1]  
    2377 2397             elif char == '\r':  # this is for windows, cross platform?  
    2378                   orm_object.Reading += '\n'  
      2398                 reading_object.Reading += '\n'  
    2378 2398             else:  
    2379                   orm_object.Reading += char  
      2399                 reading_object.Reading += char  
    2379 2399         else:  
    2380 2400             if char in '\r\x08':  # this is for windows, cross platform?  
    2381 2401                 pass  
    2382 2402             else:  
    2383                   orm_object.Reading = char  
      2403                 reading_object.Reading = char  
    2383 2403  
    2384 2404     def GetRole(self, rx, ry):  
    2385 2405         '''In which role was the fact type clicked?'''  
    2386           orm_object = self.Get('Target')  
    2387           roles = orm_object.GetList('ORMRole')  
      2406         fact_object = self.Target  
      2407         reading_object = self.Target.ORMFactReading  
      2408  
      2409         roles = reading_object.ORMRoleSequence.GetList('ORMRolePosition')  
    2388 2410         roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
    2389 2411         if debug: print 'GetRole:', roles  
     
    2398 2420         if 0 <= rolenum < len(roles):  
    2399 2421             if debug: print 'rolenum:', rolenum  
    2400               return roles[rolenum]  
      2422             return roles[rolenum].ORMRole  
    2400 2422         return None  
    2401 2423  
    2402 2424     def SetSelected(self):  
      2425         fact_object = self.Target  
      2426         reading_object = self.Target.ORMFactReading  
      2427  
    2403 2428         x, y = self.canvas.clickx, self.canvas.clicky  
    2404 2429         role = self.GetRole(x, y)  
    2405 2430         if role and (role not in self.canvas.rolelist):  
    2406               for r in self.Target.GetList('ORMRole'):  
    2407                   self.canvas.RemoveRole(r)  
      2431             for r in reading_object.ORMRoleSequence.GetList('ORMRolePosition'):  
      2432                 self.canvas.RemoveRole(r.ORMRole)  
    2408 2433             self.canvas.AddRole(role)  
    2409 2434         self._SetInShell('IsSelected', True)  
     
    2422 2447     def ToggleRole(self):  
    2423 2448         if debug: print 'toggle role'  
      2449         fact_object = self.Target  
      2450         reading_object = self.Target.ORMFactReading  
      2451  
    2424 2452         x, y = self.canvas.clickx, self.canvas.clicky  
    2425 2453         role = self.GetRole(x, y)  
    2426 2454         if role in self.canvas.rolelist:  # already on, turn it off  
    2427 2455             self.canvas.RemoveRole(role)  
    2428               return any([ r.ORMFactTypeID == self.Target.ID for r in self.canvas.rolelist ])  
      2456             return any([ r.ORMFactTypeID == fact_object.ID for r in self.canvas.rolelist ])  
    2428 2456         else:  # not on, turn it on  
    2429 2457             self.canvas.AddRole(role)  
     
    2433 2461     def OnTop(self):  # must run after this object has a dcid  
    2434 2462 ##        print 'started ontop'  
      2463 ##        fact_object = self.Target  
      2464 ##        reading_object = self.Target.ORMFactReading  
      2465  
    2435 2466         followers = self.GetFollowers()  
    2436 2467         object_type_shape = None  
     
    2454 2485                     self.canvas.SetGraphic(dc, f, newid=True)  # create new one  
    2455 2486  
    2456       def ResequenceRoles(self):  
    2457           roles = self.GetList('ORMRole').sorted()  # renumber remaining roles  
    2458           for i , r in enumerate(roles):  
    2459               role.Seq = i + 1  
    2460    
    2461 2487     def Delete(self):  
      2488         fact_object = self.Target  
      2489         reading_object = self.Target.ORMFactReading  
      2490  
    2462 2491         if self.InDelete: return  
    2463 2492         self._SetInShell('InDelete', True)  
     
    2475 2504         ORMShape.Delete(self)  
    2476 2505  
      2506     def DeleteRole(self, role):  
      2507         '''use this to delete a role from a fact type'''  
      2508         fact_object = self.Target  
      2509         reading_object = self.Target.ORMFactReading  
      2510  
      2511         DeleteRole(fact_object, role)  
      2512  
      2513     def AddRole(self, role):  
      2514         '''use this to delete a role from a fact type'''  
      2515         fact_object = self.Target  
      2516         # reading_object = self.Target.ORMFactReading  
      2517  
      2518         AddRole(fact_object, role)  
      2519  
      2520 def DeleteRole(fact_object, delete_role):  # in a separate function "just in case"  
      2521     readings = fact_object.GetList('ORMFactReading')  
      2522     for reading in readings:  
      2523         roles = reading.ORMRoleSequence.GetList('ORMRolePosition')  
      2524         roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
      2525         i = 0  
      2526         for r in roles:  
      2527             if r.Role == delete_role:  
      2528                 r.Delete()  
      2529             else:  # renumber remaing role positions  
      2530                 i += 1  
      2531                 r.Seq = i  
      2532  
      2533     roles = fact_object.GetList('ORMRole')  
      2534     roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
      2535     i = 0  
      2536     for r in roles:  
      2537         if r == delete_role:  
      2538             r.Delete()  
      2539         else:  # renumber remaining roles  
      2540             i += 1  
      2541             r.Seq = i  
      2542  
      2543 def AddRole(fact_object, add_role):  # in a separate function "just in case"  
      2544     readings = fact_object.GetList('ORMFactReading')  
      2545     for reading in readings:  
      2546         roles = reading.ORMRoleSequence.GetList('ORMRolePosition')  
      2547         newpos = fact_object.db.GetObject('ORMRolePosition')  # new  
      2548         newpos.ORMRoleSequenceID = reading.ORMRoleSequence.ID  
      2549         newpos.Seq = len(roles) + 1  
      2550         newpos.ORMRoleID = add_role.ID  
      2551  
      2552     if not add_role.ORMFactType == fact_object:  # if it hasn't already been added  
      2553         roles = fact_object.GetList('ORMRole')  
      2554         add_role.ORMFactTypeID = fact_object.ID  
      2555         add_role.Seq = len(roles) + 1  
      2556  
    2477 2557 class ORMFactReadingShape(ORMFollowText):  
    2478 2558     def Draw(self, dc):  
     
    2863 2943         nodeb = self.Get('NodeB')  
    2864 2944  
    2865           seq = orm_object.Seq or 1  
      2945         # connect base on reading sequence, not fact sequence  
      2946 ##        seq = orm_object.Seq or 1  # the old ways was simpler  
      2947         seq = [ x.Seq for x in nodea.Target.ORMFactReading.ORMRoleSequence.GetList('ORMRolePosition')  
      2948                 if x.ORMRole.ID == orm_object.ID ][0]  
    2866 2949         endb = nodeb.GetPos()  
    2867 2950         enda = nodea.AdjustEnd(endb, seq)  # nodeA should be a fact shape  
     
    2923 3006         self._SetInShell('InDelete', True)  
    2924 3007         if self.Target:  
    2925               fact = self.Target.ORMFactType  
    2926               self.Target.Delete()  
    2927               fact.ResequenceRoles()  
      3008 ##            fact = self.Target.ORMFactType  
      3009 ##            self.Target.Delete()  
      3010 ##            fact.ResequenceRoles()  
      3011             self.Target.ORMFactType.DeleteRole(self.Target)  
    2928 3012         self._SetInShell('InDelete', None)  
    2929 3013         ORMShape.Delete(self)  
     
    3025 3109         # remove constraint roles that aren't for this fact  
    3026 3110         fact_roles = [cr.ORMRole for cr in cr_list if cr.ORMRole.ORMFactTypeID == nodea.Target.ID]  
    3027           seq_numbers = [role.Seq for role in fact_roles]  
      3111  
      3112 #        seq_numbers = [role.Seq for role in fact_roles]    # old way  
      3113         seq_xref = dict([ (x.ORMRoleID, x.Seq) for x in nodea.Target.ORMFactReading.ORMRoleSequence.GetList('ORMRolePosition') ])  
      3114         seq_numbers = [seq_xref[role.ID] for role in fact_roles]  
    3028 3115         if not seq_numbers: return  
    3029 3116  
     
    3573 3660  
    3574 3661     def OnPops03(self, event):  
    3575           '''Reverse role order'''  
      3662         '''Reverse role order in current reading'''  
    3575 3662         l = self.pdc.FindObjects(self.popupx, self.popupy, hitradius)  
    3576 3663         if l:  
     
    3595 3682  
    3596 3683             # reverse the order of role connectors  
    3597               roles = target.GetList('ORMRole')  
      3684             roles = reading.ORMRoleSequence.GetList('ORMRolePosition')  
      3685 ##            roles.sort(cmp=lambda x,y: cmp(x.Seq, y.Seq))  
      3686 ##            roles = target.GetList('ORMRole')  
    3598 3687             sorted_roles = sorted(roles, cmp=lambda x,y: cmp(x.Seq, y.Seq), reverse=True)  
    3599 3688             for i, x in enumerate(sorted_roles):