added support to filter adjacent coplanar edges

This commit is contained in:
Mario Voigt 2021-05-06 22:44:14 +02:00
parent e6db17cdd3
commit d048d39a62
2 changed files with 16 additions and 14 deletions

View File

@ -19,6 +19,7 @@
</param>
<param name="color_valley_cut" type="color" appearance="colorbutton" gui-text="Color for valley cuts">255</param>
<param name="color_mountain_cut" type="color" appearance="colorbutton" gui-text="Color for mountain cuts">1968208895</param>
<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="printStats" type="bool" gui-text="Show some unfold statistics">true</param>

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python3
import openmesh as om
import math
import inkex
import tempfile
import os
@ -36,14 +37,7 @@ possible import file types -> https://www.graphics.rwth-aachen.de/media/openmesh
ToDos:
- Add glue tabs
- Fix bug with canvas resizing. bounding box of paperfoldMainGroup returns unexplainable wrong results. How to update the view to get correct values here?
- Print statistics about
- groups
- edge count per type (valley cut, mountain cut, valley fold, mountain fold)
- remove unrequired extra folding edges on plane surfaces (compare the output from osresearch/papercraft and paperfoldmodels) which should be removed before printing/cutting.
For example take a pentagon - it's face gets divided into three triangles if we put it into a mesh triangulation tool. Means we receive two fold edges which we don't need.
This would create more convenient output like osresearch/papercraft and dxf2papercraft do.
See https://github.com/osresearch/papercraft/blob/master/unfold.c > coplanar_check() method
- Print statistics about groups
"""
@ -114,7 +108,9 @@ def triangleIntersection(t1, t2, epsilon):
def addVisualisationData(mesh, unfoldedMesh, originalHalfedges, unfoldedHalfedges, glueNumber, foldingDirection):
for i in range(3):
# Folding direction
if mesh.calc_dihedral_angle(originalHalfedges[i]) < 0:
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
@ -124,7 +120,7 @@ def addVisualisationData(mesh, unfoldedMesh, originalHalfedges, unfoldedHalfedge
# Function that unwinds a spanning tree
def unfoldSpanningTree(mesh, spanningTree):
unfoldedMesh = om.TriMesh() # Das abgewickelte Netz
unfoldedMesh = om.TriMesh() # the unfolded mesh
numFaces = mesh.n_faces()
sizeTree = spanningTree.number_of_edges()
@ -438,6 +434,7 @@ def writeSVG(self, unfolding, size, printNumbers):
gluePairs = 0
mountainCuts = 0
valleyCuts = 0
coplanarLines = 0
mountainPerforations = 0
valleyPerforations = 0
@ -467,10 +464,6 @@ def writeSVG(self, unfolding, size, printNumbers):
# Write a straight line between the two corners
line = paperfoldPageGroup.add(inkex.PathElement())
#line.path = [
# ["M", [vertex0[0], vertex0[1]]],
# ["L", [vertex1[0], vertex1[1]]]
# ]
line.set('d', "M " + str(vertex0[0]) + "," + str(vertex0[1]) + " " + str(vertex1[0]) + "," + str(vertex1[1]))
# Colour depending on folding direction
lineStyle = {"fill": "none"}
@ -482,6 +475,10 @@ def writeSVG(self, unfolding, size, printNumbers):
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:
lineStyle.update({"stroke": self.options.color_coplanar_lines})
line.set("id", self.svg.get_unique_id("coplanar-line-"))
coplanarLines += 1
lineStyle.update({"stroke-width":str(strokewidth)})
lineStyle.update({"stroke-linecap":"butt"})
@ -542,6 +539,7 @@ def writeSVG(self, unfolding, size, printNumbers):
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))
inkex.utils.debug(" * Number of mountain perforations: " + str(mountainPerforations))
inkex.utils.debug(" * Number of valley perforations: " + str(valleyPerforations))
inkex.utils.debug("-----------------------------------------------------------")
@ -562,6 +560,7 @@ class Unfold(inkex.EffectExtension):
pars.add_argument("--extraborder_units")
pars.add_argument("--color_valley_cut", type=Color, default='255', help="Color for valley cuts")
pars.add_argument("--color_mountain_cut", type=Color, default='1968208895', help="Color for mountain cuts")
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("--printStats", type=inkex.Boolean, default=True, help="Show some unfold statistics")
@ -571,6 +570,8 @@ class Unfold(inkex.EffectExtension):
inkex.utils.debug("The input file does not exist. Please select a proper file and try again.")
exit(1)
mesh = om.read_trimesh(self.options.inputfile)
#mesh = om.read_polymesh(self.options.inputfile) #we must work with triangles instead of polygons because the algorithm works with that
fullUnfolded, unfoldedComponents = unfold(mesh, self.options.maxNumFaces, self.options.printStats)
# Compute maxSize of the components
# All components must be scaled to the same size as the largest component