[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