diff --git a/extensions/fablabchemnitz/imagetracer.js/imagetracerjs.py b/extensions/fablabchemnitz/imagetracer.js/imagetracerjs.py index 19fb8ae0..bcb851d8 100644 --- a/extensions/fablabchemnitz/imagetracer.js/imagetracerjs.py +++ b/extensions/fablabchemnitz/imagetracer.js/imagetracerjs.py @@ -160,13 +160,28 @@ class Imagetracerjs (inkex.EffectExtension): trace_height = viewBox.split(' ')[3] # add transformation to fit previous XY coordinates and width/height + # image might also be influenced by other transformations from parent: + parent = image.getparent() + if parent is not None and parent != self.document.getroot(): + tpc = parent.composed_transform() + x_offset = tpc.e + y_offset = tpc.f + else: + x_offset = 0.0 + y_offset = 0.0 img_w = image.get('width') img_h = image.get('height') img_x = image.get('x') - img_y = image.get('y') + img_y = image.get('y') if img_w is not None and img_h is not None and img_x is not None and img_y is not None: + #if width/height are not unitless but end with px, mm, in etc. we have to convert to a float number + if img_w[-1].isdigit() is False: + img_w = self.svg.uutounit(img_w) + if img_h[-1].isdigit() is False: + img_h = self.svg.uutounit(img_h) + transform = "matrix({:1.6f}, 0, 0, {:1.6f}, {:1.6f}, {:1.6f})"\ - .format(float(img_w) / float(trace_width), float(img_h) / float(trace_height), float(img_x), float(img_y)) + .format(float(img_w) / float(trace_width), float(img_h) / float(trace_height), float(img_x) + x_offset, float(img_y) + y_offset) newGroup.attrib['transform'] = transform else: t = image.composed_transform() @@ -175,7 +190,7 @@ class Imagetracerjs (inkex.EffectExtension): img_x = t.e img_y = t.f transform = "matrix({:1.6f}, 0, 0, {:1.6f}, {:1.6f}, {:1.6f})"\ - .format(float(img_w) / float(trace_width), float(img_h) / float(trace_height), float(img_x), float(img_y)) + .format(float(img_w) / float(trace_width), float(img_h) / float(trace_height), float(img_x) + x_offset, float(img_y) + y_offset) newGroup.attrib['transform'] = transform for child in doc.getchildren(): diff --git a/extensions/fablabchemnitz/primitive/primitive.py b/extensions/fablabchemnitz/primitive/primitive.py index ddb31416..5d9b702e 100644 --- a/extensions/fablabchemnitz/primitive/primitive.py +++ b/extensions/fablabchemnitz/primitive/primitive.py @@ -89,6 +89,19 @@ class Primitive (inkex.EffectExtension): image = Image.open(BytesIO(base64.b64decode(image_string[i + 1:len(image_string)]))) else: image = Image.open(self.path) + + if node.get('width')[-1].isdigit() is False or node.get('height')[-1].isdigit() is False: + inkex.utils.debug("Image seems to have some weird dimensions in XML structure. Please remove units from width and height attributes at ") + return + + parent = node.getparent() + if parent is not None and parent != self.document.getroot(): + tpc = parent.composed_transform() + x_offset = tpc.e + y_offset = tpc.f + else: + x_offset = 0.0 + y_offset = 0.0 # Write the embedded or linked image to temporary directory if os.name == "nt": @@ -130,16 +143,16 @@ class Primitive (inkex.EffectExtension): # Delete the temporary png file again because we do not need it anymore if os.path.exists(exportfile): os.remove(exportfile) - + # new parse the SVG file and insert it as new group into the current document tree doc = etree.parse(exportfile + ".svg").getroot() - newGroup = self.document.getroot().add(inkex.Group()) - newGroup.attrib['transform'] = "matrix(" + \ - str(float(node.get('width')) / float(doc.get('width'))) + \ - ", 0, 0 , " + \ - str(float(node.get('height')) / float(doc.get('height'))) + \ - "," + node.get('x') + \ - "," + node.get('y') + ")" + newGroup = self.document.getroot().add(inkex.Group()) + newGroup.attrib['transform'] = "matrix({:0.6f}, 0, 0, {:0.6f}, {:0.6f}, {:0.6f})".format( + float(node.get('width')) / float(doc.get('width')), + float(node.get('height')) / float(doc.get('height')), + float(node.get('x')) + x_offset, + float(node.get('y')) + y_offset + ) newGroup.append(doc) # Delete the temporary svg file