Esempio n. 1
0
class GenericLoader(LoaderWithComposites):

    format_name = ''

    base_style = None

    def __init__(self, file, filename, match):
        LoaderWithComposites.__init__(self)
        self.file = file
        self.filename = filename
        self.match = match
        self.style = Style()
        if self.base_style is not None:
            self.prop_stack = PropertyStack(base=self.base_style.Duplicate())
        else:
            self.prop_stack = PropertyStack()
        self.messages = {}

    def get_prop_stack(self):
        stack = self.prop_stack
        if not self.style.IsEmpty():
            stack.load_AddStyle(self.style)
        stack.condense()
        if self.base_style is not None:
            self.prop_stack = PropertyStack(base=self.base_style.Duplicate())
        else:
            self.prop_stack = PropertyStack()
        self.style = Style()
        return stack

    def set_prop_stack(self, stack):
        self.prop_stack = stack

    def document(self, *args, **kw):
        self.begin_composite(doc_class, args, kw)

    def layer(self, *args, **kw):
        self.begin_layer_class(SK1Layer, args, kw)

    def masterlayer(self, *args, **kw):
        while not issubclass(self.composite_class, doc_class):
            self.end_composite()
        kw['is_MasterLayer'] = 1
        self.begin_layer_class(SK1Layer, args, kw)

    def begin_page(self, *args, **kw):
        while not issubclass(self.composite_class, doc_class):
            self.end_composite()
        if not len(args):
            args = ["", deepcopy(self.page_layout)]
        self.begin_composite(page_class, args, kw)

    def end_layer(self):
        self.end_composite()

    def begin_layer_class(self, layer_class, args, kw=None):
        if issubclass(self.composite_class, SK1Layer):
            self.end_composite()
        if issubclass(self.composite_class, doc_class) or issubclass(
                self.composite_class, page_class):
            self.begin_composite(layer_class, args, kw)
        else:
            print 'self.composite_class is %s, not a document', self.composite_class


#			raise SketchLoadError('self.composite_class is %s, not a document',
#									self.composite_class)

    def bezier(self, paths=None):
        self.append_object(
            PolyBezier(paths=paths, properties=self.get_prop_stack()))

    def rectangle(self, m11, m21, m12, m22, v1, v2, radius1=0, radius2=0):
        trafo = Trafo(m11, m21, m12, m22, v1, v2)
        self.append_object(
            Rectangle(trafo,
                      radius1=radius1,
                      radius2=radius2,
                      properties=self.get_prop_stack()))

    def ellipse(self,
                m11,
                m21,
                m12,
                m22,
                v1,
                v2,
                start_angle=0.0,
                end_angle=0.0,
                arc_type=sk1const.ArcPieSlice):
        self.append_object(
            Ellipse(Trafo(m11, m21, m12, m22, v1, v2),
                    start_angle,
                    end_angle,
                    arc_type,
                    properties=self.get_prop_stack()))

    def simple_text(self,
                    str,
                    trafo=None,
                    valign=sk1const.ALIGN_BASE,
                    halign=sk1const.ALIGN_LEFT):
        if type(trafo) == TupleType:
            if len(trafo) == 2:
                trafo = apply(Translation, trafo)
            else:
                raise TypeError, "trafo must be a Trafo-object or a 2-tuple"
        self.append_object(
            text.SimpleText(text=str,
                            trafo=trafo,
                            valign=valign,
                            halign=halign,
                            properties=self.get_prop_stack()))

    def image(self, image, trafo):
        if type(trafo) == TupleType:
            if len(trafo) == 2:
                trafo = apply(Translation, trafo)
            else:
                raise TypeError, "trafo must be a Trafo-object or a 2-tuple"
        self.append_object(SK1Image(image, trafo=trafo))

    def begin_group(self, *args, **kw):
        self.begin_composite(SK1Group, args, kw)

    def end_group(self):
        self.end_composite()

    def guess_cont(self):
        self.guess_continuity = 1

    def end_composite(self):
        isdoc = self.composite_class is doc_class
        LoaderWithComposites.end_composite(self)
        if isdoc:
            self.add_meta(self.object)

    def add_meta(self, doc):
        doc.meta.fullpathname = self.filename
        dir, name = os.path.split(self.filename)
        doc.meta.directory = dir
        doc.meta.filename = name
        doc.meta.native_format = 0
        doc.meta.format_name = self.format_name

    def add_message(self, message):
        #		pdebug(('load', 'echo_messages'), message)
        self.messages[message] = self.messages.get(message, 0) + 1

    def Messages(self):
        messages = self.messages.items()
        list = []
        for message, count in messages:
            if count > 1:
                list.append(_("%(message)s (%(count)d times)") % locals())
            else:
                list.append(message)
        list.sort()
        return string.join(list, '\n')