Advertisement
Guest User

Untitled

a guest
Jan 17th, 2012
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.99 KB | None | 0 0
  1. class ImageRegion(object):
  2.     """
  3.    
  4.    -- single: single representation of the menu (for static menus)
  5.    images/App.Menu.png
  6.  
  7.    -- single, multi-image: segmented (for dynamic menus: changes as resized)
  8.    images/App.Menu-0.png
  9.    images/App.Menu-1.png
  10.    
  11.    -- set: for menus that can exist in different orientations
  12.    images/App.Menu[0].png
  13.    images/App.Menu[1].png
  14.    
  15.    -- set, multi-image: different orientations, segmented (changes as resized)
  16.    images/App.Menu[0]-0.png
  17.    images/App.Menu[0]-1.png
  18.    images/App.Menu[1]-0.png
  19.    images/App.Menu[1]-1.png
  20.    
  21.    """        
  22.    
  23.     # collection constants
  24.     COL_TYPE_SINGLE = 'SINGLE'
  25.     COL_TYPE_SERIES = 'SERIES'
  26.     COL_TYPE_SEQUENCE = 'SEQUNECE'
  27.     COL_TYPE_SERIES_SEQUENCE = 'SERIES_SEQUENCE'
  28.  
  29.     # name types
  30.     NAME_TYPE_FULL = 'FULL'                     # Application.FileMenu.SaveDialog,button
  31.     NAME_TYPE_GENERIC = 'GENERIC'               # Application.SaveDialog,button    
  32.     NAME_TYPE_CLASS_ENTITY = "CLASS_ENTITY"     # Button,button
  33.     NAME_TYPE_CLASS = 'CLASS'                   # Button
  34.        
  35.     log = None
  36.     name = None
  37.     collectionType = None
  38.     nameType = None
  39.     range = None
  40.     entity = None
  41.     region = None
  42.     state = None
  43.     filename = None
  44.    
  45.     threadLock = None
  46.    
  47.     def __init__(self, entity, region=None, state=None):
  48.        
  49.         self.log = RobotLogger(entity=entity) # get logger singleton
  50.         self.entity = entity # entity images are associated with
  51.        
  52.         if region:
  53.             self.region = region # set the region to search within
  54.         else:
  55.             self.region = Config.screen # default to entire screen
  56.         self.log.debug("region=%s" % self.region)
  57.        
  58.         # check button state
  59.         if state == None or state == "":
  60.             self.state = "" #enabled state doesn't need a tag
  61.         else:
  62.             self.state = "[%s]" % state        
  63.        
  64.         """
  65.        NAME_TYPE_FULL = 'FULL'                     # Application.FileMenu.SaveDialog,button    # Application.FileMenu.SaveDialog
  66.        NAME_TYPE_GENERIC = 'GENERIC'               # Application.SaveDialog,button             # Application.SaveDialog
  67.        NAME_TYPE_CLASS_ENTITY = 'CLASS_ENTITY'     # Button,button                          # Window.SaveDialog
  68.        NAME_TYPE_CLASS = 'CLASS'                   # Button                                 # Window
  69.        """
  70.        
  71.         for filename, nameType in ( \
  72.                                     (entity.getCanonicalName(ancestorEntities=False, topLevel=False) + '/' + entity.getCanonicalName(),self.NAME_TYPE_FULL), \
  73.                                     (entity.getCanonicalName(ancestorEntities=False, topLevel=False) + '/' + entity.getCanonicalName(ancestorEntities=False), self.NAME_TYPE_GENERIC), \
  74.                                     (entity.getClassName() + entity.getCanonicalName(rootEntity=False, ancestorEntities=False, parentEntity=False), self.NAME_TYPE_CLASS_ENTITY), \
  75.                                     (entity.getClassName(), self.NAME_TYPE_CLASS)
  76.                                 ):
  77.        
  78.             # single
  79.             try:
  80.                 ImageLocator().locate(filename + self.state + Config.imageSuffix)[:-4] # get full path, minus .png extension
  81.             except:
  82.                 pass # file doesn't exist
  83.             else:      
  84.                 self.filename = filename    
  85.                 self.nameType = nameType
  86.                 self.collectionType = self.COL_TYPE_SINGLE
  87.                 self.range = [0,]
  88.                 self.__logFound()
  89.                 return
  90.                
  91.             # sequence
  92.             try:
  93.                 ImageLocator().locate(filename + '-0' + self.state +  Config.imageSuffix)[:-4] # get full path, minus .png extension
  94.             except:
  95.                 pass # file doesn't exist
  96.             else:            
  97.                 self.filename = filename
  98.                 self.nameType = nameType
  99.                 self.collectionType = self.COL_TYPE_SEQUENCE
  100.                 self.range = [0,]
  101.                 self.__logFound()  
  102.                 return
  103.    
  104.             # series
  105.             seq = 0
  106.             while True:
  107.                 try:                
  108.                     ImageLocator().locate(filename + '[' + str(seq) + ']' + self.state + Config.imageSuffix)[:-4] # get full path, minus .png extension              
  109.                 except:
  110.                     break # end of series
  111.                 else:
  112.                     seq += 1
  113.    
  114.             if seq > 0:
  115.                 self.filename = filename
  116.                 self.nameType = nameType
  117.                 self.collectionType = self.COL_TYPE_SERIES
  118.                 self.range = range(0, seq)
  119.                 self.__logFound()                
  120.                 return
  121.            
  122.             # sequence + series
  123.             seq = 0
  124.             while True:        
  125.                 try:
  126.                     ImageLocator().locate(filename + '[' + str(seq) + ']-0' + self.state +  Config.imageSuffix)[:-4] # get full path, minus .png extension
  127.                 except:
  128.                     break # end of sequence
  129.                 else:
  130.                     seq += 1
  131.                    
  132.             if seq > 0:
  133.                 self.filename = filename
  134.                 self.nameType = nameType
  135.                 self.collectionType = self.COL_TYPE_SERIES_SEQUENCE
  136.                 self.range = range(0, seq)                
  137.                 self.__logFound()
  138.                 return
  139.            
  140.             self.log.debug("failed to find image on disk [\"%s%s\"] nameType=%s" % (filename, self.state, nameType))
  141.                
  142.         raise ImageMissing("cannot find image on disk [\"%s%s\"]" % (filename, self.state)) # if we don't have single image or sequence, file cannot be found            
  143.                
  144.     def __logFound(self):
  145.        
  146.         pngs = []
  147.         # sequence and series                
  148.         for series in self.range:  
  149.             pngs.append( ','.join( self.log.image(self.getImageNames(), tag='series_' + str(series) )) )
  150.        
  151.         self.log.debug("[\"%s\"](%s) colType=%s nameType=%s" % (self.filename, ','.join(pngs), self.collectionType, self.nameType))
  152.        
  153.     def getImageNames(self, series=0, state=None):
  154.         """ Return the image names for a certain sequence
  155.        @keyword type: Collection type
  156.        @keyword series: If COL_SERIES or COL_SERIES_SEQUENCE, series #
  157.        
  158.        """
  159.                        
  160.         files = []
  161.         sequence = 0
  162.         while True:            
  163.             try:        
  164.                 # form suffix based on type, series/sequence #        
  165.                 if self.collectionType == self.COL_TYPE_SINGLE:
  166.                     suffix = ''
  167.                 elif self.collectionType == self.COL_TYPE_SERIES:
  168.                     suffix = '[' + str(series) + ']'
  169.                 elif self.collectionType == self.COL_TYPE_SEQUENCE:
  170.                     suffix = '-' + str(sequence)
  171.                 elif self.collectionType == self.COL_TYPE_SERIES_SEQUENCE:
  172.                     suffix = '[' + str(series) + ']-' + str(sequence)
  173.                                    
  174.                 files.append( ImageLocator().locate(self.filename + suffix + self.state + Config.imageSuffix) )
  175.             except java.io.FileNotFoundException, e:
  176.                 break # end of sequence
  177.             else:
  178.                 # If single image, or series only 1 file to return
  179.                 if (self.collectionType == self.COL_TYPE_SINGLE) or (self.collectionType == self.COL_TYPE_SERIES):
  180.                     return files
  181.                 else:
  182.                     sequence += 1
  183.        
  184.         assert len(files) > 0 # we should have returned at least one file        
  185.         return files
  186.    
  187.     def find(self, timeout=5):
  188.                
  189.         self.log.debug(" colType=%s" % (self.collectionType))
  190.        
  191.         #startTime = time.time()     (time.time() - startTime)
  192.        
  193.         attempt = 0
  194.         while attempt < timeout:
  195.             attempt += 1
  196.             try:            
  197.                 result = self.performFind()
  198.                 self.log.debug("-- success! [attempt=%i]" % attempt)
  199.                 return result
  200.             except ImageSearchExhausted, e:  
  201.                 self.log.debug("-- failure! [attempt=%i]" % attempt)
  202.                
  203.         raise FindExhausted()
  204.                                    
  205.  
  206.    
  207.     def performFind(self):
  208.        
  209.         # poorman's lock? Major problems were encountered by sleeping the main thread
  210.         # This will sleep the main thread when a handler is active
  211.         if (Thread.currentThread() != ImageRegion.threadLock) and ImageRegion.threadLock:
  212.             self.log.debug("threadlock in effect, sleeping %s" % Thread.currentThread())
  213.             while ImageRegion.threadLock:
  214.                 sleep(1)
  215.             self.log.debug("threadlock cleared, waking %s" % Thread.currentThread())
  216.        
  217.         # sequence and series                
  218.         for series in self.range:            
  219.             regions = []
  220.             lastRegion = self.region
  221.             nextRegion = Region(self.region)
  222.            
  223.             # try to match all images in the sequence      
  224.             try:                                
  225.                 for (sequence, filename) in enumerate(self.getImageNames(series=series,state=self.state)):
  226.                    
  227.                     transforms = Transforms(filename, entity=self.entity)    
  228.                    
  229.                     # Apply prev search attribs
  230.                     nextRegion = transforms.apply(nextRegion, Transforms.CONTEXT_PREVIOUS)
  231.                     # Apply search attribs
  232.                    
  233.                     pattern = transforms.apply(Pattern(filename), Transforms.CONTEXT_CURRENT)
  234.                    
  235.                     # find the image on the screen
  236.                     lastRegion = nextRegion.wait( pattern ) # If we don't set to zero wait time (dialog handler threads wait indefinitely)
  237.                    
  238.                     self.log.debug("validated [%s](%s) [%s](%s) in region [%s](%s) nameType=%s colType=%s ser=%s seq=%s" % (filename, self.log.image(filename), lastRegion, self.log.region(region=lastRegion), nextRegion, self.log.region(region=nextRegion), self.nameType, self.collectionType, series, sequence))
  239.                     regions.append( lastRegion )
  240.  
  241.                     # Transform next region with the spacial region
  242.                     # spacialRegion is only used if there are spacial modifiers
  243.                     nextRegion = transforms.apply(Region(nextRegion), Transforms.CONTEXT_NEXT, override=lastRegion)
  244.  
  245.                                        
  246.             except FindFailed, e:
  247.                 self.log.debug("failed to find on screen [\"images\"](%s) in [%s](%s) nameType=%s colType=%s ser=%s seq=%s" % (','.join(self.log.image(self.getImageNames(series=series,state=self.state))), nextRegion, self.log.region(nextRegion), self.nameType, self.collectionType, series, sequence))                
  248.             else:
  249.                
  250.                 # if single region just return it
  251.                 if len(regions) == 1:
  252.                     return regions[0]
  253.                                
  254.                 # more than one region, get min/max region        
  255.                 minX, minY = 9999, 9999
  256.                 maxX, maxY = -9999, -9999
  257.                 for region in regions:
  258.                     if region.getX() < minX: minX = region.getX()  
  259.                     if region.getY() < minY: minY = region.getY()
  260.                     if (region.getX() + region.getW()) > maxX: maxX = region.getX() + region.getW()  
  261.                     if (region.getY() + region.getH()) > maxY: maxY = region.getY() + region.getH()
  262.                
  263.                 # return final region
  264.                 region = Region(minX, minY, maxX-minX, maxY-minY)
  265.                 return region
  266.        
  267.         raise ImageSearchExhausted()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement