[Bf-extensions-cvs] [c9605694] master: io_export_paper_model: update to upstream 932e32
Adam Dominec
noreply at git.blender.org
Sun Aug 6 10:15:13 CEST 2017
Commit: c9605694fa2abb23f51dedafaa03eadd34f3aab5
Author: Adam Dominec
Date: Sun Aug 6 10:12:08 2017 +0200
Branches: master
https://developer.blender.org/rBAc9605694fa2abb23f51dedafaa03eadd34f3aab5
io_export_paper_model: update to upstream 932e32
===================================================================
M io_export_paper_model.py
===================================================================
diff --git a/io_export_paper_model.py b/io_export_paper_model.py
index 508b953f..1203d18f 100644
--- a/io_export_paper_model.py
+++ b/io_export_paper_model.py
@@ -20,7 +20,7 @@ bl_info = {
"name": "Export Paper Model",
"author": "Addam Dominec",
"version": (0, 9),
- "blender": (2, 70, 0),
+ "blender": (2, 73, 0),
"location": "File > Export > Paper Model",
"warning": "",
"description": "Export printable net of the active mesh",
@@ -30,12 +30,10 @@ bl_info = {
"tracker_url": "https://developer.blender.org/T38441"
}
-#### TODO:
-# sanitize the constructors so that they don't edit their parent object
-# rename verts -> vertices, edge.vect -> edge.vector
-# SVG object doesn't need a 'pure_net' argument in constructor
-# remember selected objects before baking, except selected to active
-# islands with default names should be excluded while matching
+# TODO:
+# sanitize the constructors Edge, Face, UVFace so that they don't edit their parent object
+# The Exporter classes should take parameters as a whole pack, and parse it themselves
+# remember objects selected before baking (except selected to active)
# add 'estimated number of pages' to the export UI
# profile QuickSweepline vs. BruteSweepline with/without blist: for which nets is it faster?
# rotate islands to minimize area -- and change that only if necessary to fill the page size
@@ -76,6 +74,14 @@ default_priority_effect = {
'LENGTH': -0.05
}
+global_paper_sizes = [
+ ('USER', "User defined", "User defined paper size"),
+ ('A4', "A4", "International standard paper size"),
+ ('A3', "A3", "International standard paper size"),
+ ('US_LETTER', "Letter", "North American paper size"),
+ ('US_LEGAL', "Legal", "North American paper size")
+]
+
def first_letters(text):
"""Iterator over the first letter of each word"""
@@ -104,10 +110,10 @@ def pairs(sequence):
def argmax_pair(array, key):
"""Find an (unordered) pair of indices that maximize the given function"""
- l = len(array)
+ n = len(array)
mi, mj, m = None, None, None
- for i in range(l):
- for j in range(i+1, l):
+ for i in range(n):
+ for j in range(i+1, n):
k = key(array[i], array[j])
if not m or k > m:
mi, mj, m = i, j, k
@@ -124,10 +130,10 @@ def fitting_matrix(v1, v2):
def z_up_matrix(n):
"""Get a rotation matrix that aligns given vector upwards."""
b = n.xy.length
- l = n.length
+ s = n.length
if b > 0:
return M.Matrix((
- (n.x*n.z/(b*l), n.y*n.z/(b*l), -b/l),
+ (n.x*n.z/(b*s), n.y*n.z/(b*s), -b/s),
(-n.y/b, n.x/b, 0),
(0, 0, 0)
))
@@ -146,7 +152,8 @@ def create_blank_image(image_name, dimensions, alpha=1):
width, height = int(dimensions.x), int(dimensions.y)
image = bpy.data.images.new(image_name, width, height, alpha=True)
if image.users > 0:
- raise UnfoldError("There is something wrong with the material of the model. "
+ raise UnfoldError(
+ "There is something wrong with the material of the model. "
"Please report this on the BlenderArtists forum. Export failed.")
image.pixels = [1, 1, 1, alpha] * (width * height)
image.file_format = 'PNG'
@@ -175,7 +182,10 @@ def bake(face_indices, uvmap, image):
me.materials.append(mat)
loop = me.uv_layers[me.uv_layers.active_index].data
face_indices = set(face_indices)
- ignored_uvs = [face.loop_start + i for face in me.polygons if face.index not in face_indices for i, v in enumerate(face.vertices)]
+ ignored_uvs = [
+ face.loop_start + i
+ for face in me.polygons if face.index not in face_indices
+ for i, v in enumerate(face.vertices)]
for vid in ignored_uvs:
loop[vid].uv[0] *= -1
loop[vid].uv[1] *= -1
@@ -284,7 +294,7 @@ class Unfolder:
bk = rd.bake
if rd.engine == 'CYCLES':
recall = sce.cycles.bake_type, bk.use_selected_to_active, bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear
- lookup = {'TEXTURE': 'DIFFUSE_COLOR', 'AMBIENT_OCCLUSION': 'AO', 'RENDER': 'COMBINED', 'SELECTED_TO_ACTIVE': 'COMBINED'}
+ lookup = {'TEXTURE': 'DIFFUSE', 'AMBIENT_OCCLUSION': 'AO', 'RENDER': 'COMBINED', 'SELECTED_TO_ACTIVE': 'COMBINED'}
sce.cycles.bake_type = lookup[properties.output_type]
bk.use_selected_to_active = (properties.output_type == 'SELECTED_TO_ACTIVE')
bk.margin, bk.cage_extrusion, bk.use_cage, bk.use_clear = 0, 10, False, False
@@ -299,7 +309,8 @@ class Unfolder:
if image_packing == 'PAGE_LINK':
self.mesh.save_image(tex, printable_size * ppm, filepath)
elif image_packing == 'ISLAND_LINK':
- self.mesh.save_separate_images(tex, ppm, filepath)
+ image_dir = filepath[:filepath.rfind(".")]
+ self.mesh.save_separate_images(tex, ppm, image_dir)
elif image_packing == 'ISLAND_EMBED':
self.mesh.save_separate_images(tex, ppm, filepath, embed=Exporter.encode_image)
@@ -322,7 +333,7 @@ class Mesh:
"""Wrapper for Bpy Mesh"""
def __init__(self, mesh, matrix):
- self.verts = dict()
+ self.vertices = dict()
self.edges = dict()
self.edges_by_verts_indices = dict()
self.faces = dict()
@@ -330,7 +341,7 @@ class Mesh:
self.data = mesh
self.pages = list()
for bpy_vertex in mesh.vertices:
- self.verts[bpy_vertex.index] = Vertex(bpy_vertex, matrix)
+ self.vertices[bpy_vertex.index] = Vertex(bpy_vertex, matrix)
for bpy_edge in mesh.edges:
edge = Edge(bpy_edge, self, matrix)
self.edges[bpy_edge.index] = edge
@@ -346,7 +357,7 @@ class Mesh:
def check_correct(self, epsilon=1e-6):
"""Check for invalid geometry"""
- null_edges = {i for i, e in self.edges.items() if e.length < epsilon and e.faces}
+ null_edges = {i for i, e in self.edges.items() if e.vector.length < epsilon and e.faces}
null_faces = {i for i, f in self.faces.items() if f.normal.length_squared < epsilon}
twisted_faces = {i for i, f in self.faces.items() if f.is_twisted()}
if not (null_edges or null_faces or twisted_faces):
@@ -358,8 +369,11 @@ class Mesh:
edge.select = (edge.index in null_edges)
for face in self.data.polygons:
face.select = (face.index in null_faces or face.index in twisted_faces)
- cure = "Remove Doubles and Triangulate" if (null_edges or null_faces) and twisted_faces else "Triangulate" if twisted_faces else "Remove Doubles"
- raise UnfoldError("The model contains:\n" +
+ cure = ("Remove Doubles and Triangulate" if (null_edges or null_faces) and twisted_faces
+ else "Triangulate" if twisted_faces
+ else"Remove Doubles")
+ raise UnfoldError(
+ "The model contains:\n" +
(" {} zero-length edge(s)\n".format(len(null_edges)) if null_edges else "") +
(" {} zero-area face(s)\n".format(len(null_faces)) if null_faces else "") +
(" {} twisted polygon(s)\n".format(len(twisted_faces)) if twisted_faces else "") +
@@ -373,12 +387,12 @@ class Mesh:
edges = [edge for edge in self.edges.values() if not edge.force_cut and len(edge.faces) > 1]
if edges:
- average_length = sum(edge.length for edge in edges) / len(edges)
+ average_length = sum(edge.vector.length for edge in edges) / len(edges)
for edge in edges:
edge.generate_priority(priority_effect, average_length)
edges.sort(reverse=False, key=lambda edge: edge.priority)
for edge in edges:
- if edge.length == 0:
+ if edge.vector.length_squared == 0:
continue
face_a, face_b = edge.main_faces
island_a, island_b = face_a.uvface.island, face_b.uvface.island
@@ -449,7 +463,9 @@ class Mesh:
return direction_to_float(uvedge.vb.co - uvedge.va.co)
uvedges.sort(key=uvedge_sortkey)
- for right, left in zip(uvedges[:-1:2], uvedges[1::2]) if is_inwards(uvedges[0]) else zip([uvedges[-1]] + uvedges[1::2], uvedges[:-1:2]):
+ for right, left in (
+ zip(uvedges[:-1:2], uvedges[1::2]) if is_inwards(uvedges[0])
+ else zip([uvedges[-1]] + uvedges[1::2], uvedges[:-1:2])):
left.neighbor_right = right
right.neighbor_left = left
return True
@@ -465,14 +481,14 @@ class Mesh:
def uvedge_priority(uvedge):
"""Retuns whether it is a good idea to stick something on this edge's face"""
# TODO: it should take into account overlaps with faces and with other stickers
- return uvedge.uvface.face.area / sum((vb.co - va.co).length for (va, vb) in pairs(uvedge.uvface.verts))
+ return uvedge.uvface.face.area / sum((vb.co - va.co).length for (va, vb) in pairs(uvedge.uvface.vertices))
def add_sticker(uvedge, index, target_island):
uvedge.sticker = Sticker(uvedge, default_width, index, target_island)
uvedge.island.add_marker(uvedge.sticker)
for edge in self.edges.values():
- if edge.is_main_cut and len(edge.uvedges) >= 2 and edge.vect.length_squared > 0:
+ if edge.is_main_cut and len(edge.uvedges) >= 2 and edge.vector.length_squared > 0:
uvedge_a, uvedge_b = edge.uvedges[:2]
if uvedge_priority(uvedge_a) < uvedge_priority(uvedge_b):
uvedge_a, uvedge_b = uvedge_b, uvedge_a
@@ -521,14 +537,14 @@ class Mesh:
def scale_islands(self, scale):
for island in self.islands:
- for point in chain((vertex.co for vertex in island.verts), island.fake_verts):
+ for point in chain((vertex.co for vertex in island.vertices), island.fake
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list