added some more features to paperfold

This commit is contained in:
leyghisbb 2021-05-08 00:19:56 +02:00
parent 8cdbf8d9ef
commit 8616f0135f
2 changed files with 30 additions and 23 deletions

View File

@ -4,9 +4,11 @@
<id>fablabchemnitz.de.paperfold</id>
<param name="tab" type="notebook">
<page name="tab_settings" gui-text="Paperfold for Inkscape">
<param name="inputfile" type="path" gui-text="Input File" filetypes="obj,off,ply,stl" gui-description="The model to unfold" mode="file">/your/beautiful/3dmodel/file</param>
<param name="inputfile" type="path" gui-text="Input File" filetypes="obj,off,ply,stl" mode="file" gui-description="The model to unfold. You can use obj files provided in extensions dir of Inkscape \Poly3DObjects\*.obj to play around">/your/beautiful/3dmodel/file</param>
<param name="maxNumFaces" type="int" min="1" max="99999" gui-text="Maximum allowed faces" gui-description="If the STL file has too much detail it contains a large number of faces. This will make unfolding extremely slow. So we can limit it.">200</param>
<param name="printNumbers" type="bool" gui-text="Print numbers on the cut edges">true</param>
<param name="printAngles" type="bool" gui-text="Print folding angles on the cut edges">true</param>
<param name="fontSize" type="int" min="1" max="100" gui-text="Label font size (%)">15</param>
<param name="scalefactor" type="float" precision="3" min="0.0001" max="10000.0" gui-text="Manual scale factor" gui-description="default is 1.0">1.0</param>
<param name="resizetoimport" type="bool" gui-text="Resize the canvas to the imported drawing's bounding box">true</param>
<param name="extraborder" type="float" precision="3" gui-text="Add extra border around fitted canvas">0.0</param>
@ -22,7 +24,10 @@
<param name="color_coplanar_lines" type="color" appearance="colorbutton" gui-text="Color for coplanar lines">1943148287</param>
<param name="color_valley_perforate" type="color" appearance="colorbutton" gui-text="Color for valley perforations">3422552319</param>
<param name="color_mountain_perforate" type="color" appearance="colorbutton" gui-text="Color for mountain perforations">879076607</param>
<param name="dashes" type="bool" gui-text="Dashes for cut/coplanar lines">true</param>
<param name="printStats" type="bool" gui-text="Show some unfold statistics">true</param>
<label appearance="header">Post Processing</label>
<label appearance="url">https://clementzheng.github.io/joinery</label>
</page>
<page name="tab_about" gui-text="About">
<label appearance="header">Paperfold for Inkscape</label>

View File

@ -107,14 +107,7 @@ def triangleIntersection(t1, t2, epsilon):
# Functions for visualisation and output
def addVisualisationData(mesh, unfoldedMesh, originalHalfedges, unfoldedHalfedges, glueNumber, foldingDirection):
for i in range(3):
# Folding direction
if round(math.degrees(mesh.calc_dihedral_angle(originalHalfedges[i])), 3) == 0.0:
foldingDirection[unfoldedMesh.edge_handle(unfoldedHalfedges[i]).idx()] = 0 # adjacent coplanar
elif mesh.calc_dihedral_angle(originalHalfedges[i]) < 0:
foldingDirection[unfoldedMesh.edge_handle(unfoldedHalfedges[i]).idx()] = -1
else:
foldingDirection[unfoldedMesh.edge_handle(unfoldedHalfedges[i]).idx()] = 1
foldingDirection[unfoldedMesh.edge_handle(unfoldedHalfedges[i]).idx()] = round(math.degrees(mesh.calc_dihedral_angle(originalHalfedges[i])), 3)
# Information, which edges belong together
glueNumber[unfoldedMesh.edge_handle(unfoldedHalfedges[i]).idx()] = mesh.edge_handle(originalHalfedges[i]).idx()
@ -128,7 +121,7 @@ def unfoldSpanningTree(mesh, spanningTree):
isFoldingEdge = np.zeros(numUnfoldedEdges, dtype=bool) # Indicates whether an edge is folded or cut
glueNumber = np.empty(numUnfoldedEdges, dtype=int) # Saves with which edge is glued together
foldingDirection = np.empty(numUnfoldedEdges, dtype=int) # Valley folding or mountain folding
foldingDirection = np.empty(numUnfoldedEdges, dtype=float) # Valley folding or mountain folding
connections = np.empty(numFaces, dtype=int) # Saves which original triangle belongs to the unrolled one
@ -447,10 +440,9 @@ def writeSVG(self, unfolding, size, printNumbers):
strokewidth = 0.002 * boxSize
dashLength = 0.008 * boxSize
spaceLength = 0.02 * boxSize
textDistance = 0.02 * boxSize
textDistance = boxSize * self.options.fontSize / 800
textStrokewidth = 0.05 * strokewidth
textLength = 0.001 * boxSize
fontsize = 0.015 * boxSize
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-")))
@ -467,15 +459,18 @@ def writeSVG(self, unfolding, size, printNumbers):
line.set('d', "M " + str(vertex0[0]) + "," + str(vertex0[1]) + " " + str(vertex1[0]) + "," + str(vertex1[1]))
# Colour depending on folding direction
lineStyle = {"fill": "none"}
if foldingDirection[edge.idx()] > 0:
dihedralAngle = foldingDirection[edge.idx()]
if dihedralAngle > 0:
lineStyle.update({"stroke": self.options.color_mountain_cut})
line.set("id", self.svg.get_unique_id("mountain-cut-"))
mountainCuts += 1
elif foldingDirection[edge.idx()] < 0:
elif dihedralAngle < 0:
lineStyle.update({"stroke": self.options.color_valley_cut})
line.set("id", self.svg.get_unique_id("valley-cut-"))
valleyCuts += 1
elif foldingDirection[edge.idx()] == 0:
elif dihedralAngle == 0:
lineStyle.update({"stroke": self.options.color_coplanar_lines})
line.set("id", self.svg.get_unique_id("coplanar-line-"))
coplanarLines += 1
@ -486,13 +481,14 @@ def writeSVG(self, unfolding, size, printNumbers):
lineStyle.update({"stroke-miterlimit":"4"})
# Dotted lines for folding edges
if isFoldingEdge[edge.idx()]:
lineStyle.update({"stroke-dasharray":(str(dashLength) + ", " + str(spaceLength))})
if foldingDirection[edge.idx()] > 0:
if isFoldingEdge[edge.idx()]:
if self.options.dashes is True:
lineStyle.update({"stroke-dasharray":(str(dashLength) + ", " + str(spaceLength))})
if dihedralAngle > 0:
lineStyle.update({"stroke": self.options.color_mountain_perforate})
line.set("id", self.svg.get_unique_id("mountain-perforate-"))
mountainPerforations += 1
if foldingDirection[edge.idx()] < 0:
if dihedralAngle < 0:
lineStyle.update({"stroke": self.options.color_valley_perforate})
line.set("id", self.svg.get_unique_id("valley-perforate-"))
valleyPerforations += 1
@ -525,18 +521,21 @@ def writeSVG(self, unfolding, size, printNumbers):
text.set("x", str(position[0]))
text.set("y", str(position[1]))
text.set("font-size", str(fontsize))
text.set("style", "stroke-width:" + str(textStrokewidth))
text.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center")
text.set("transform", "rotate(" + str(rotation) + "," + str(position[0]) + "," + str(position[1]) + ")")
tspan = text.add(Tspan())
tspan.set("x", str(position[0]))
tspan.set("y", str(position[1]))
tspan.set("style", "stroke-width:" + str(textStrokewidth))
tspan.set("style", "stroke-width:" + str(textStrokewidth) + ";text-anchor:middle;text-align:center")
tspan.text = str(glueNumber[edge.idx()])
if self.options.printAngles is True:
tspan.text += " ({:0.2f}°)".format(dihedralAngle)
gluePairs += 1
if self.options.printStats is True:
inkex.utils.debug("Folding edges stats: ")
inkex.utils.debug("Folding edges stats:")
inkex.utils.debug(" * Number of mountain cuts: " + str(mountainCuts))
inkex.utils.debug(" * Number of valley cuts: " + str(valleyCuts))
inkex.utils.debug(" * Number of coplanar lines: " + str(coplanarLines))
@ -554,6 +553,8 @@ class Unfold(inkex.EffectExtension):
pars.add_argument("--inputfile")
pars.add_argument("--maxNumFaces", type=int, default=200, help="If the STL file has too much detail it contains a large number of faces. This will make unfolding extremely slow. So we can limit it.")
pars.add_argument("--printNumbers", type=inkex.Boolean, default=False, help="Print numbers on the cut edges")
pars.add_argument("--printAngles", type=inkex.Boolean, default=False, help="Print folding angles on the cut edges")
pars.add_argument("--fontSize", type=int, default=15, help="Label font size (%)")
pars.add_argument("--scalefactor", type=float, default=1.0, help="Manual scale factor")
pars.add_argument("--resizetoimport", type=inkex.Boolean, default=True, help="Resize the canvas to the imported drawing's bounding box")
pars.add_argument("--extraborder", type=float, default=0.0)
@ -563,6 +564,7 @@ class Unfold(inkex.EffectExtension):
pars.add_argument("--color_coplanar_lines", type=Color, default='1943148287', help="Color for coplanar lines")
pars.add_argument("--color_valley_perforate", type=Color, default='3422552319', help="Color for valley perforations")
pars.add_argument("--color_mountain_perforate", type=Color, default='879076607', help="Color for mountain perforations")
pars.add_argument("--dashes", type=inkex.Boolean, default=True, help="Dashes for cut/coplanar lines")
pars.add_argument("--printStats", type=inkex.Boolean, default=True, help="Show some unfold statistics")
def effect(self):