added more paperfold options

This commit is contained in:
leyghisbb 2021-05-08 19:29:02 +02:00
parent 0af00d9a8d
commit 4ecb9b2df9
2 changed files with 53 additions and 20 deletions

View File

@ -34,6 +34,7 @@
<param name="fontSize" type="int" min="1" max="100" gui-text="Label font size (%)">15</param> <param name="fontSize" type="int" min="1" max="100" gui-text="Label font size (%)">15</param>
<param name="flipLabels" type="bool" gui-text="Flip labels">false</param> <param name="flipLabels" type="bool" gui-text="Flip labels">false</param>
<param name="dashes" type="bool" gui-text="Dashes for cut/coplanar lines">true</param> <param name="dashes" type="bool" gui-text="Dashes for cut/coplanar lines">true</param>
<param name="saturationsForAngles" type="bool" gui-text="Adjust color saturation for folding edges" gui-description="The larger the angle the darker the color">false</param>
<param name="separateGluePairsByColor" type="bool" gui-text="Separate glue pairs by color">false</param> <param name="separateGluePairsByColor" type="bool" gui-text="Separate glue pairs by color">false</param>
<param name="colorValleyCut" type="color" appearance="colorbutton" gui-text="Valley cut edges">255</param> <param name="colorValleyCut" type="color" appearance="colorbutton" gui-text="Valley cut edges">255</param>
<param name="colorMountainCut" type="color" appearance="colorbutton" gui-text="Mountain cut edges">1968208895</param> <param name="colorMountainCut" type="color" appearance="colorbutton" gui-text="Mountain cut edges">1968208895</param>

View File

@ -441,31 +441,52 @@ def writeSVG(self, unfolding, size, randomColorSet):
textStrokewidth = boxSize * self.options.fontSize / 3000 textStrokewidth = boxSize * self.options.fontSize / 3000
fontsize = boxSize * self.options.fontSize / 1000 fontsize = boxSize * self.options.fontSize / 1000
# Generate a main group minAngle = min(foldingDirection)
paperfoldPageGroup = self.document.getroot().add(inkex.Group(id=self.svg.get_unique_id("paperfold-page-"))) 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: if self.options.printTriangleNumbers is True:
faceIdx = 0
for face in mesh.faces(): for face in mesh.faces():
faceIdx += 1
centroid = mesh.calc_face_centroid(face) centroid = mesh.calc_face_centroid(face)
circle = paperfoldPageGroup.add(Circle(cx=str(centroid[0]), cy=str(centroid[1]), r=str(fontsize))) textFaceGroup = inkex.Group(id=uniqueMainId + "-textFace-" + str(face.idx()))
circle.set('id', self.svg.get_unique_id('faceCircle-'))
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") 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("x", str(centroid[0]))
text.set("y", str(centroid[1] + fontsize / 3)) text.set("y", str(centroid[1] + fontsize / 3))
text.set("font-size", str(fontsize)) text.set("font-size", str(fontsize))
text.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center") 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("x", str(centroid[0]))
tspan.set("y", str(centroid[1] + fontsize / 3)) tspan.set("y", str(centroid[1] + fontsize / 3))
tspan.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center") 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 # Go over all edges of the grid
for edge in mesh.edges(): for edge in mesh.edges():
# The two endpoints # The two endpoints
@ -474,7 +495,7 @@ def writeSVG(self, unfolding, size, randomColorSet):
vertex1 = mesh.point(mesh.to_vertex_handle(he)) vertex1 = mesh.point(mesh.to_vertex_handle(he))
# Write a straight line between the two corners # 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])) line.set('d', "M " + str(vertex0[0]) + "," + str(vertex0[1]) + " " + str(vertex1[0]) + "," + str(vertex1[1]))
# Colour depending on folding direction # Colour depending on folding direction
lineStyle = {"fill": "none"} lineStyle = {"fill": "none"}
@ -483,15 +504,15 @@ def writeSVG(self, unfolding, size, randomColorSet):
if dihedralAngle > 0: if dihedralAngle > 0:
lineStyle.update({"stroke": self.options.colorMountainCut}) 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 mountainCuts += 1
elif dihedralAngle < 0: elif dihedralAngle < 0:
lineStyle.update({"stroke": self.options.colorValleyCut}) 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 valleyCuts += 1
elif dihedralAngle == 0: elif dihedralAngle == 0:
lineStyle.update({"stroke": self.options.colorCoplanarEdges}) 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: #if self.options.importCoplanarEdges is False:
# line.delete() # line.delete()
coplanarLines += 1 coplanarLines += 1
@ -507,15 +528,15 @@ def writeSVG(self, unfolding, size, randomColorSet):
lineStyle.update({"stroke-dasharray":(str(dashLength) + ", " + str(spaceLength))}) lineStyle.update({"stroke-dasharray":(str(dashLength) + ", " + str(spaceLength))})
if dihedralAngle > 0: if dihedralAngle > 0:
lineStyle.update({"stroke": self.options.colorMountainPerforates}) 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 mountainPerforations += 1
if dihedralAngle < 0: if dihedralAngle < 0:
lineStyle.update({"stroke": self.options.colorValleyPerforates}) 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 valleyPerforations += 1
if dihedralAngle == 0: if dihedralAngle == 0:
lineStyle.update({"stroke": self.options.colorCoplanarEdges}) 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: if self.options.importCoplanarEdges is False:
line.delete() line.delete()
valleyPerforations += 1 valleyPerforations += 1
@ -530,9 +551,19 @@ def writeSVG(self, unfolding, size, randomColorSet):
lineStyle.update({"stroke-dashoffset":"0"}) lineStyle.update({"stroke-dashoffset":"0"})
lineStyle.update({"stroke-opacity":"1"}) 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 line.style = lineStyle
########################################################
# Textual things # Textual things
########################################################
halfEdge = mesh.halfedge_handle(edge, 0) # Find halfedge in the face halfEdge = mesh.halfedge_handle(edge, 0) # Find halfedge in the face
if mesh.face_handle(halfEdge).idx() == -1: if mesh.face_handle(halfEdge).idx() == -1:
halfEdge = mesh.opposite_halfedge_handle(halfEdge) halfEdge = mesh.opposite_halfedge_handle(halfEdge)
@ -549,7 +580,7 @@ def writeSVG(self, unfolding, size, randomColorSet):
if self.options.flipLabels is True: if self.options.flipLabels is True:
rotation += 180 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("x", str(position[0]))
text.set("y", str(position[1])) text.set("y", str(position[1]))
text.set("font-size", str(fontsize)) text.set("font-size", str(fontsize))
@ -614,7 +645,8 @@ class Unfold(inkex.EffectExtension):
#Style #Style
pars.add_argument("--fontSize", type=int, default=15, help="Label font size (%)") 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("--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("--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("--colorValleyCut", type=Color, default='255', help="Valley cut edges")
pars.add_argument("--colorMountainCut", type=Color, default='1968208895', help="Mountain 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()) newColor = '#%02X%02X%02X' % (r(),r(),r())
if newColor not in randomColorSet: if newColor not in randomColorSet:
randomColorSet.append(newColor) randomColorSet.append(newColor)
# Create a new container group to attach all paperfolds # 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 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)): for i in range(len(unfoldedComponents)):