diff --git a/extensions/fablabchemnitz/paperfold.inx b/extensions/fablabchemnitz/paperfold.inx index 88393462..ae154ac4 100644 --- a/extensions/fablabchemnitz/paperfold.inx +++ b/extensions/fablabchemnitz/paperfold.inx @@ -34,6 +34,7 @@ 15 false true + false false 255 1968208895 diff --git a/extensions/fablabchemnitz/paperfold.py b/extensions/fablabchemnitz/paperfold.py index 9d6fae92..90ac7ce0 100644 --- a/extensions/fablabchemnitz/paperfold.py +++ b/extensions/fablabchemnitz/paperfold.py @@ -441,31 +441,52 @@ def writeSVG(self, unfolding, size, randomColorSet): textStrokewidth = boxSize * self.options.fontSize / 3000 fontsize = boxSize * self.options.fontSize / 1000 - # Generate a main group - paperfoldPageGroup = self.document.getroot().add(inkex.Group(id=self.svg.get_unique_id("paperfold-page-"))) + minAngle = min(foldingDirection) + maxAngle = max(foldingDirection) + angleRange = maxAngle - minAngle + #self.msg(minAngle) + #self.msg(maxAngle) + #self.msg(angleRange) + # Grouping + uniqueMainId = self.svg.get_unique_id("") + + paperfoldPageGroup = self.document.getroot().add(inkex.Group(id=uniqueMainId + "-paperfold-page")) + + textGroup = inkex.Group(id=uniqueMainId + "-text") + edgesGroup = inkex.Group(id=uniqueMainId + "-edges") + paperfoldPageGroup.add(textGroup) + paperfoldPageGroup.add(edgesGroup) + + textFacesGroup = inkex.Group(id=uniqueMainId + "-textFaces") + textEdgesGroup = inkex.Group(id=uniqueMainId + "-textEdges") + textGroup.add(textFacesGroup) + textGroup.add(textEdgesGroup) + if self.options.printTriangleNumbers is True: - faceIdx = 0 + for face in mesh.faces(): - faceIdx += 1 centroid = mesh.calc_face_centroid(face) - circle = paperfoldPageGroup.add(Circle(cx=str(centroid[0]), cy=str(centroid[1]), r=str(fontsize))) - circle.set('id', self.svg.get_unique_id('faceCircle-')) + textFaceGroup = inkex.Group(id=uniqueMainId + "-textFace-" + str(face.idx())) + + circle = textFaceGroup.add(Circle(cx=str(centroid[0]), cy=str(centroid[1]), r=str(fontsize))) + circle.set('id', uniqueMainId + "-textFaceCricle-" + str(face.idx())) circle.set("style", "stroke:#000000;stroke-width:" + str(strokewidth/2) + ";fill:none") - text = paperfoldPageGroup.add(TextElement(id=self.svg.get_unique_id("faceNumber-"))) + text = textFaceGroup.add(TextElement(id=uniqueMainId + "-textFaceNumber-" + str(face.idx()))) text.set("x", str(centroid[0])) text.set("y", str(centroid[1] + fontsize / 3)) text.set("font-size", str(fontsize)) text.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center") - tspan = text.add(Tspan()) + tspan = text.add(Tspan(id=uniqueMainId + "-textFaceNumberTspan-" + str(face.idx()))) tspan.set("x", str(centroid[0])) tspan.set("y", str(centroid[1] + fontsize / 3)) tspan.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center") - tspan.text = str(faceIdx) - + tspan.text = str(face.idx()) + textFacesGroup.append(textFaceGroup) + # Go over all edges of the grid for edge in mesh.edges(): # The two endpoints @@ -474,7 +495,7 @@ def writeSVG(self, unfolding, size, randomColorSet): vertex1 = mesh.point(mesh.to_vertex_handle(he)) # Write a straight line between the two corners - line = paperfoldPageGroup.add(inkex.PathElement()) + line = edgesGroup.add(inkex.PathElement()) line.set('d', "M " + str(vertex0[0]) + "," + str(vertex0[1]) + " " + str(vertex1[0]) + "," + str(vertex1[1])) # Colour depending on folding direction lineStyle = {"fill": "none"} @@ -483,15 +504,15 @@ def writeSVG(self, unfolding, size, randomColorSet): if dihedralAngle > 0: lineStyle.update({"stroke": self.options.colorMountainCut}) - line.set("id", self.svg.get_unique_id("mountain-cut-")) + line.set("id", uniqueMainId + "-mountain-cut-" + str(edge.idx())) mountainCuts += 1 elif dihedralAngle < 0: lineStyle.update({"stroke": self.options.colorValleyCut}) - line.set("id", self.svg.get_unique_id("valley-cut-")) + line.set("id", uniqueMainId + "-valley-cut-" + str(edge.idx())) valleyCuts += 1 elif dihedralAngle == 0: lineStyle.update({"stroke": self.options.colorCoplanarEdges}) - line.set("id", self.svg.get_unique_id("coplanar-edge-")) + line.set("id", uniqueMainId + "-coplanar-edge-" + str(edge.idx())) #if self.options.importCoplanarEdges is False: # line.delete() coplanarLines += 1 @@ -507,15 +528,15 @@ def writeSVG(self, unfolding, size, randomColorSet): lineStyle.update({"stroke-dasharray":(str(dashLength) + ", " + str(spaceLength))}) if dihedralAngle > 0: lineStyle.update({"stroke": self.options.colorMountainPerforates}) - line.set("id", self.svg.get_unique_id("mountain-perforate-")) + line.set("id", uniqueMainId + "-mountain-perforate-" + str(edge.idx())) mountainPerforations += 1 if dihedralAngle < 0: lineStyle.update({"stroke": self.options.colorValleyPerforates}) - line.set("id", self.svg.get_unique_id("valley-perforate-")) + line.set("id", uniqueMainId + "-valley-perforate-" + str(edge.idx())) valleyPerforations += 1 if dihedralAngle == 0: lineStyle.update({"stroke": self.options.colorCoplanarEdges}) - line.set("id", self.svg.get_unique_id("coplanar-edge-")) + line.set("id", uniqueMainId + "-coplanar-edge-" + str(edge.idx())) if self.options.importCoplanarEdges is False: line.delete() valleyPerforations += 1 @@ -530,9 +551,19 @@ def writeSVG(self, unfolding, size, randomColorSet): lineStyle.update({"stroke-dashoffset":"0"}) lineStyle.update({"stroke-opacity":"1"}) + + if self.options.saturationsForAngles is True: + if dihedralAngle != 0: #we dont want to apply HSL adjustments for zero angle lines because they would be invisible then + hslColor = inkex.Color(lineStyle.get('stroke')).to_hsl() + newSaturation = abs(dihedralAngle / angleRange) * 100 #percentage values + hslColor.saturation = newSaturation + lineStyle.update({"stroke":hslColor.to_rgb()}) + line.style = lineStyle + ######################################################## # Textual things + ######################################################## halfEdge = mesh.halfedge_handle(edge, 0) # Find halfedge in the face if mesh.face_handle(halfEdge).idx() == -1: halfEdge = mesh.opposite_halfedge_handle(halfEdge) @@ -549,7 +580,7 @@ def writeSVG(self, unfolding, size, randomColorSet): if self.options.flipLabels is True: rotation += 180 - text = paperfoldPageGroup.add(TextElement(id=self.svg.get_unique_id("edgeNumber-"))) + text = textEdgesGroup.add(TextElement(id=uniqueMainId + "-edgeNumber-" + str(edge.idx()))) text.set("x", str(position[0])) text.set("y", str(position[1])) text.set("font-size", str(fontsize)) @@ -614,7 +645,8 @@ class Unfold(inkex.EffectExtension): #Style pars.add_argument("--fontSize", type=int, default=15, help="Label font size (%)") pars.add_argument("--flipLabels", type=inkex.Boolean, default=False, help="Flip labels") - pars.add_argument("--dashes", type=inkex.Boolean, default=True, help="Dashes for cut/coplanar edges") + pars.add_argument("--dashes", type=inkex.Boolean, default=True, help="Dashes for cut/coplanar edges") + pars.add_argument("--saturationsForAngles", type=inkex.Boolean, help="Adjust color saturation for folding edges. The larger the angle the darker the color") pars.add_argument("--separateGluePairsByColor", type=inkex.Boolean, default=False, help="Separate glue pairs by color") pars.add_argument("--colorValleyCut", type=Color, default='255', help="Valley cut edges") pars.add_argument("--colorMountainCut", type=Color, default='1968208895', help="Mountain cut edges") @@ -646,7 +678,7 @@ class Unfold(inkex.EffectExtension): newColor = '#%02X%02X%02X' % (r(),r(),r()) if newColor not in randomColorSet: randomColorSet.append(newColor) - + # Create a new container group to attach all paperfolds paperfoldMainGroup = self.document.getroot().add(inkex.Group(id=self.svg.get_unique_id("paperfold-"))) #make a new group at root level for i in range(len(unfoldedComponents)):