~xpresser-team/xpresser/xpresser-type-with-hold

« back to all changes in this revision

Viewing changes to xpresser/imagedir.py

  • Committer: Gustavo Niemeyer
  • Date: 2010-05-16 22:59:48 UTC
  • Revision ID: gustavo@niemeyer.net-20100516225948-hm96jar095u9jhm2
Creating branch with initial version of Xpresser.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import ConfigParser
 
2
import os
 
3
import re
 
4
 
 
5
from xpresser.errors import XpresserError
 
6
from xpresser.image import Image
 
7
 
 
8
 
 
9
CLICK_POSITION_RE = re.compile(r"^\s*(?P<x>[-+][0-9]+)\s+(?P<y>[-+][0-9]+)\s*$")
 
10
 
 
11
 
 
12
class ImageDirError(XpresserError):
 
13
    """Error related to the image directory."""
 
14
 
 
15
 
 
16
class ImageDir(object):
 
17
    """Represents a directory with data about images.
 
18
 
 
19
    This class doesn't know about any details regarding the images
 
20
    themselves, besides the existence of the file in which they reside.
 
21
    It will give access to generic ImageData objects containing the
 
22
    details about these images.  It's up to an ImageLoader to make sense
 
23
    of the actual image data contained in the image files.
 
24
    """
 
25
 
 
26
    def __init__(self):
 
27
        self._images = {}
 
28
 
 
29
    def get(self, image_name):
 
30
        return self._images.get(image_name)
 
31
 
 
32
    def load(self, dirname):
 
33
        """Load image information from C{dirname}.
 
34
 
 
35
        @param dirname: Path of directory containing xpresser.ini.
 
36
        """
 
37
        ini_filename = os.path.join(dirname, "xpresser.ini")
 
38
        if not os.path.exists(ini_filename):
 
39
            raise ImageDirError("File %s not found" % ini_filename)
 
40
        config = ConfigParser.ConfigParser()
 
41
        config.read(ini_filename)
 
42
        for section_name in config.sections():
 
43
            if section_name.startswith("image "):
 
44
                image_name = section_name.split(None, 1)[1]
 
45
                try:
 
46
                    image_filename = config.get(section_name, "filename")
 
47
                except ConfigParser.NoOptionError:
 
48
                    raise ImageDirError("Image %s missing filename option"
 
49
                                        % image_name)
 
50
                image_filename = os.path.join(dirname, image_filename)
 
51
                if not os.path.exists(image_filename):
 
52
                    raise ImageDirError("Image %s file not found: %s" %
 
53
                                        (image_name, image_filename))
 
54
                try:
 
55
                    image_similarity = config.getfloat(section_name,
 
56
                                                       "similarity")
 
57
                except ConfigParser.NoOptionError:
 
58
                    image_similarity = None
 
59
                except ValueError:
 
60
                    value = config.get(section_name, "similarity")
 
61
                    raise ImageDirError("Image %s has bad similarity: %s"
 
62
                                        % (image_name, value))
 
63
                                                  
 
64
                try:
 
65
                    value = config.get(section_name, "focus_delta")
 
66
                    match = CLICK_POSITION_RE.match(value)
 
67
                    if not match:
 
68
                        raise ImageDirError("Image %s has invalid click "
 
69
                                            "position: %s" %
 
70
                                            (image_name, value))
 
71
                    image_focus_delta = (int(match.group("x")),
 
72
                                            int(match.group("y")))
 
73
                except ConfigParser.NoOptionError:
 
74
                    image_focus_delta = None
 
75
                image = Image(name=image_name,
 
76
                              filename=image_filename,
 
77
                              similarity=image_similarity,
 
78
                              focus_delta=image_focus_delta)
 
79
                self._images[image_name] = image
 
80