Beispiel #1
0
    def read_tag(self, tag, node):
        """Read a tag.

        Any tag name that is in self._handlers will be handled.
        Similarly any attribute name in self._attribReader._handlers
        will be parsed. Both tag and attribute results are stored in
        node.

        Any path data is ultimately handled by
        self._pathReader.add_path(...). For any  geometry that is not
        already in the 'd' attribute of a 'path' tag this class
        converts it first to this format and then delegates it to
        add_path(...).

        """
        tagName = self._get_tag(tag)
        if tagName in self._handlers:
            # log.debug("reading tag: " + tagName)
            # parse own attributes and overwrite in node
            for attr, value in tag.attrib.items():
                # log.debug("considering attrib: " + attr)
                self._attribReader.read_attrib(node, attr, value)
            # accumulate transformations
            node['xformToWorld'] = matrixMult(node['xformToWorld'],
                                              node['xform'])
            # read tag
            if (tagName == 'image'):
                self._handlers[tagName](tag, node)
            elif (tagName != 'text'):
                self._handlers[tagName](node)
            else:
                self.find_cut_settings_tags(tag, node)
Beispiel #2
0
    def read_tag(self, tag, node):
        """Read a tag.

        Any tag name that is in self._handlers will be handled.
        Similarly any attribute name in self._attribReader._handlers
        will be parsed. Both tag and attribute results are stored in
        node.

        Any path data is ultimately handled by
        self._pathReader.add_path(...). For any  geometry that is not
        already in the 'd' attribute of a 'path' tag this class
        converts it first to this format and then delegates it to
        add_path(...).

        """
        tagName = self._get_tag(tag)
        if tagName in self._handlers:
            # log.debug("reading tag: " + tagName)
            # parse own attributes and overwrite in node
            for attr,value in tag.attrib.items():
                # log.debug("considering attrib: " + attr)
                self._attribReader.read_attrib(node, attr, value)
            # accumulate transformations
            node['xformToWorld'] = matrixMult(node['xformToWorld'], node['xform'])
            # read tag
            if (tagName == 'image'):
                self._handlers[tagName](tag,node)
            elif (tagName != 'text'):
                self._handlers[tagName](node)
            else:
                self.find_cut_settings_tags(tag, node)
Beispiel #3
0
    def transformAttrib(self, node, attr, value):
        # http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace
        xforms = []
        matches = self.re_findall_transforms(value)
        # this parses  something like "translate(50,50), rotate(56)"" to
        # [('translate(50,50)', 'translate', '50,50'), ('rotate(56)', 'rotate', '56')]
        for match in matches:
            xformKind = match[1]
            params = parseFloats(match[2])

            # translate
            if xformKind == 'translate':
                if len(params) == 1:
                    xforms.append([1, 0, 0, 1, params[0], params[0]])
                elif len(params) == 2:
                    xforms.append([1, 0, 0, 1, params[0], params[1]])
                else:
                    log.warn('translate skipped; invalid num of params')
            # rotate
            elif xformKind == 'rotate':
                if len(params) == 3:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([1, 0, 0, 1, params[1], params[2]])
                    xforms.append([
                        math.cos(angle),
                        math.sin(angle), -math.sin(angle),
                        math.cos(angle), 0, 0
                    ])
                    xforms.append([1, 0, 0, 1, -params[1], -params[2]])
                elif len(params) == 1:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([
                        math.cos(angle),
                        math.sin(angle), -math.sin(angle),
                        math.cos(angle), 0, 0
                    ])
                else:
                    log.warn('rotate skipped; invalid num of params')
            #scale
            elif xformKind == 'scale':
                if len(params) == 1:
                    xforms.append([params[0], 0, 0, params[0], 0, 0])
                elif len(params) == 2:
                    xforms.append([params[0], 0, 0, params[1], 0, 0])
                else:
                    log.warn('scale skipped; invalid num of params')
            # matrix
            elif xformKind == 'matrix':
                if len(params) == 6:
                    xforms.append(params)
                else:
                    log.warn('matrix skipped; invalid num of params')
            # skewX
            elif xformKind == 'skewX':
                if len(params) == 1:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([1, 0, math.tan(angle), 1, 0, 0])
                else:
                    log.warn('skewX skipped; invalid num of params')
            # skewY
            elif xformKind == 'skewY':
                if len(params) == 1:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([1, math.tan(angle), 0, 1, 0, 0])
                else:
                    log.warn('skewY skipped; invalid num of params')

        #calculate combined transformation matrix
        xform_combined = [1, 0, 0, 1, 0, 0]
        for xform in xforms:
            xform_combined = matrixMult(xform_combined, xform)

        # assign
        node['xform'] = xform_combined
    def transformAttrib(self, node, attr, value):
        # http://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace
        xforms = []
        matches = self.re_findall_transforms(value)
        # this parses  something like "translate(50,50), rotate(56)"" to
        # [('translate(50,50)', 'translate', '50,50'), ('rotate(56)', 'rotate', '56')]
        for match in matches:
            xformKind = match[1]
            params = parseFloats(match[2])

            # translate
            if xformKind == 'translate':
                if len(params) == 1:
                    xforms.append([1, 0, 0, 1, params[0], params[0]])
                elif len(params) == 2:
                    xforms.append([1, 0, 0, 1, params[0], params[1]])
                else:
                    log.warn('translate skipped; invalid num of params')
            # rotate
            elif xformKind == 'rotate':
                if len(params) == 3:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([1, 0, 0, 1, params[1], params[2]])
                    xforms.append([math.cos(angle), math.sin(angle), -math.sin(angle), math.cos(angle), 0, 0])
                    xforms.append([1, 0, 0, 1, -params[1], -params[2]])
                elif len(params) == 1:
                    angle = params[0] * self.DEG_TO_RAD
                    xforms.append([math.cos(angle), math.sin(angle), -math.sin(angle), math.cos(angle), 0, 0])
                else:
                    log.warn('rotate skipped; invalid num of params')
            #scale
            elif xformKind == 'scale':
                if len(params) == 1:
                    xforms.append([params[0], 0, 0, params[0], 0, 0])
                elif len(params) == 2:
                    xforms.append([params[0], 0, 0, params[1], 0, 0])
                else:
                    log.warn('scale skipped; invalid num of params')
            # matrix
            elif xformKind == 'matrix':
                if len(params) == 6:
                    xforms.append(params)
                else:
                    log.warn('matrix skipped; invalid num of params')
            # skewX
            elif xformKind == 'skewX':
                if len(params) == 1:
                    angle = params[0]*self.DEG_TO_RAD
                    xforms.append([1, 0, math.tan(angle), 1, 0, 0])
                else:
                    log.warn('skewX skipped; invalid num of params')
            # skewY
            elif xformKind == 'skewY':
                if len(params) == 1:
                    angle = params[0]*self.DEG_TO_RAD
                    xforms.append([1, math.tan(angle), 0, 1, 0, 0])
                else:
                    log.warn('skewY skipped; invalid num of params')

        #calculate combined transformation matrix
        xform_combined = [1,0,0,1,0,0]
        for xform in xforms:
            xform_combined = matrixMult(xform_combined, xform)

        # assign
        node['xform'] = xform_combined