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)
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)
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