[Bf-extensions-cvs] [ef5f9c32] master: mesh_f2: update to working version 1, 8, 4: T65867 Thanks ID_Inc

meta-androcto noreply at git.blender.org
Sun Jun 23 07:44:33 CEST 2019


Commit: ef5f9c3291ffec316e1d0a380ca2357351104a8d
Author: meta-androcto
Date:   Sun Jun 23 15:44:10 2019 +1000
Branches: master
https://developer.blender.org/rBAef5f9c3291ffec316e1d0a380ca2357351104a8d

mesh_f2: update to working version 1,8,4: T65867 Thanks ID_Inc

===================================================================

M	mesh_f2.py

===================================================================

diff --git a/mesh_f2.py b/mesh_f2.py
index ae246f47..672ba886 100644
--- a/mesh_f2.py
+++ b/mesh_f2.py
@@ -1,3 +1,5 @@
+# Updated for 2.8 jan 5 2019
+
 # ##### BEGIN GPL LICENSE BLOCK #####
 #
 #  This program is free software; you can redistribute it and/or
@@ -21,8 +23,8 @@
 bl_info = {
     "name": "F2",
     "author": "Bart Crouch, Alexander Nedovizin, Paul Kotelevets "
-              "(concept design)",
-    "version": (1, 7, 3),
+              "(concept design), Adrian Rutkowski",
+    "version": (1, 8, 4),
     "blender": (2, 80, 0),
     "location": "Editmode > F",
     "warning": "",
@@ -32,16 +34,46 @@ bl_info = {
     "category": "Mesh",
 }
 
+# ref: https://github.com/Cfyzzz/Other-scripts/blob/master/f2.py
 
 import bmesh
 import bpy
 import itertools
 import mathutils
+import math
+from mathutils import Vector
 from bpy_extras import view3d_utils
 
 
+# returns a custom data layer of the UV map, or None
+def get_uv_layer(ob, bm, mat_index):
+    uv = None
+    uv_layer = None
+    if ob.material_slots:
+        me = ob.data
+        if me.uv_layers:
+            uv = me.uv_layers.active.name
+    # 'material_slots' is deprecated (Blender Internal)
+    # else:
+    #     mat = ob.material_slots[mat_index].material
+    #     if mat is not None:
+    #         slot = mat.texture_slots[mat.active_texture_index]
+    #         if slot and slot.uv_layer:
+    #             uv = slot.uv_layer
+    #         else:
+    #             for tex_slot in mat.texture_slots:
+    #                 if tex_slot and tex_slot.uv_layer:
+    #                     uv = tex_slot.uv_layer
+    #                     break
+    if uv:
+        uv_layer = bm.loops.layers.uv.get(uv)
+
+    return (uv_layer)
+
+
 # create a face from a single selected edge
 def quad_from_edge(bm, edge_sel, context, event):
+    addon_prefs = context.preferences.addons[__name__].preferences
     ob = context.active_object
     region = context.region
     region_3d = context.space_data.region_3d
@@ -49,9 +81,9 @@ def quad_from_edge(bm, edge_sel, context, event):
     # find linked edges that are open (<2 faces connected) and not part of
     # the face the selected edge belongs to
     all_edges = [[edge for edge in edge_sel.verts[i].link_edges if \
-        len(edge.link_faces) < 2 and edge != edge_sel and \
-        sum([face in edge_sel.link_faces for face in edge.link_faces]) == 0] \
-        for i in range(2)]
+                  len(edge.link_faces) < 2 and edge != edge_sel and \
+                  sum([face in edge_sel.link_faces for face in edge.link_faces]) == 0] \
+                 for i in range(2)]
     if not all_edges[0] or not all_edges[1]:
         return
 
@@ -64,7 +96,7 @@ def quad_from_edge(bm, edge_sel, context, event):
             vert = [vert for vert in edge.verts if not vert.select][0]
             world_pos = ob.matrix_world @ vert.co.copy()
             screen_pos = view3d_utils.location_3d_to_region_2d(region,
-                region_3d, world_pos)
+                                                               region_3d, world_pos)
             dist = (mouse_pos - screen_pos).length
             if not min_dist or dist < min_dist[0]:
                 min_dist = (dist, edge, vert)
@@ -88,7 +120,7 @@ def quad_from_edge(bm, edge_sel, context, event):
             if not normal_edge.link_faces:
                 # no connected faces, so no need to flip the face normal
                 flip_align = False
-    if flip_align: # there is a face to which the normal can be aligned
+    if flip_align:  # there is a face to which the normal can be aligned
         ref_verts = [v for v in normal_edge.link_faces[0].verts]
         if v3 in ref_verts:
             va_1 = v3
@@ -100,7 +132,7 @@ def quad_from_edge(bm, edge_sel, context, event):
             va_1 = v2
             va_2 = v4
         if (va_1 == ref_verts[0] and va_2 == ref_verts[-1]) or \
-        (va_2 == ref_verts[0] and va_1 == ref_verts[-1]):
+                (va_2 == ref_verts[0] and va_1 == ref_verts[-1]):
             # reference verts are at start and end of the list -> shift list
             ref_verts = ref_verts[1:] + [ref_verts[0]]
         if ref_verts.index(va_1) > ref_verts.index(va_2):
@@ -120,6 +152,9 @@ def quad_from_edge(bm, edge_sel, context, event):
         mat_index = ref_faces[0].material_index
         smooth = ref_faces[0].smooth
 
+    if addon_prefs.quad_from_e_mat:
+        mat_index = bpy.context.object.active_material_index
+
     # create quad
     try:
         if v3 == v4:
@@ -150,9 +185,9 @@ def quad_from_edge(bm, edge_sel, context, event):
 
     # adjust uv-map
     if __name__ != '__main__':
-        addon_prefs = context.preferences.addons[__name__].preferences
         if addon_prefs.adjustuv:
-            for (key, uv_layer) in bm.loops.layers.uv.items():
+            uv_layer = get_uv_layer(ob, bm, mat_index)
+            if uv_layer:
                 uv_ori = {}
                 for vert in [v1, v2, v3, v4]:
                     for loop in vert.link_loops:
@@ -170,6 +205,7 @@ def quad_from_edge(bm, edge_sel, context, event):
 
 # create a face from a single selected vertex, if it is an open vertex
 def quad_from_vertex(bm, vert_sel, context, event):
+    addon_prefs = context.preferences.addons[__name__].preferences
     ob = context.active_object
     me = ob.data
     region = context.region
@@ -185,13 +221,13 @@ def quad_from_vertex(bm, vert_sel, context, event):
     mouse_pos = mathutils.Vector([event.mouse_region_x, event.mouse_region_y])
     for a, b in itertools.combinations(edges, 2):
         other_verts = [vert for edge in [a, b] for vert in edge.verts \
-            if not vert.select]
+                       if not vert.select]
         mid_other = (other_verts[0].co.copy() + other_verts[1].co.copy()) \
-            / 2
+                    / 2
         new_pos = 2 * (mid_other - vert_sel.co.copy()) + vert_sel.co.copy()
         world_pos = ob.matrix_world @ new_pos
         screen_pos = view3d_utils.location_3d_to_region_2d(region, region_3d,
-            world_pos)
+                                                           world_pos)
         dist = (mouse_pos - screen_pos).length
         if not min_dist or dist < min_dist[0]:
             min_dist = (dist, (a, b), other_verts, new_pos)
@@ -209,8 +245,8 @@ def quad_from_vertex(bm, vert_sel, context, event):
         normal_edge = edges[1]
         if not normal_edge.link_faces:
             # no connected faces, so no need to flip the face normal
-                flip_align = False
-    if flip_align: # there is a face to which the normal can be aligned
+            flip_align = False
+    if flip_align:  # there is a face to which the normal can be aligned
         ref_verts = [v for v in normal_edge.link_faces[0].verts]
         if other_verts[0] in ref_verts:
             va_1 = other_verts[0]
@@ -219,7 +255,7 @@ def quad_from_vertex(bm, vert_sel, context, event):
             va_1 = vert_sel
             va_2 = other_verts[1]
         if (va_1 == ref_verts[0] and va_2 == ref_verts[-1]) or \
-        (va_2 == ref_verts[0] and va_1 == ref_verts[-1]):
+                (va_2 == ref_verts[0] and va_1 == ref_verts[-1]):
             # reference verts are at start and end of the list -> shift list
             ref_verts = ref_verts[1:] + [ref_verts[0]]
         if ref_verts.index(va_1) > ref_verts.index(va_2):
@@ -235,6 +271,9 @@ def quad_from_vertex(bm, vert_sel, context, event):
         mat_index = ref_faces[0].material_index
         smooth = ref_faces[0].smooth
 
+    if addon_prefs.quad_from_v_mat:
+        mat_index = bpy.context.object.active_material_index
+
     # create face between all 4 vertices involved
     verts = [other_verts[0], vert_sel, other_verts[1], vert_new]
     if flip_align:
@@ -250,9 +289,9 @@ def quad_from_vertex(bm, vert_sel, context, event):
 
     # adjust uv-map
     if __name__ != '__main__':
-        addon_prefs = context.preferences.addons[__name__].preferences
         if addon_prefs.adjustuv:
-            for (key, uv_layer) in bm.loops.layers.uv.items():
+            uv_layer = get_uv_layer(ob, bm, mat_index)
+            if uv_layer:
                 uv_others = {}
                 uv_sel = None
                 uv_new = None
@@ -264,7 +303,7 @@ def quad_from_vertex(bm, vert_sel, context, event):
                             break
                 if len(uv_others) == 2:
                     mid_other = (list(uv_others.values())[0] +
-                        list(uv_others.values())[1]) / 2
+                                 list(uv_others.values())[1]) / 2
                     for loop in vert_sel.link_loops:
                         if loop.face.index > -1:
                             uv_sel = loop[uv_layer].uv
@@ -288,22 +327,206 @@ def quad_from_vertex(bm, vert_sel, context, event):
     bpy.ops.object.mode_set(mode='EDIT')
 
 
+def expand_vert(self, context, event):
+    addon_prefs = context.preferences.addons[__name__].preferences
+    ob = context.active_object
+    obj = bpy.context.object
+    me = obj.data
+    bm = bmesh.from_edit_mesh(me)
+    region = context.region
+    region_3d = context.space_data.region_3d
+    rv3d = context.space_data.region_3d
+
+    for v in bm.verts:
+        if v.select:
+            v_active = v
+
+    try:
+        depth_location = v_active.co
+    except:
+        return {'CANCELLED'}
+    # create vert in mouse cursor location
+
+    mouse_pos = Vector((event.mouse_region_x, event.mouse_region_y))
+    location_3d = view3d_utils.region_2d_to_location_3d(region, rv3d, mouse_pos, depth_location)
+
+    c_verts = []
+    # find and select linked edges that are open (<2 faces connected) add those edge verts to c_verts list
+    linked = v_active.link_edges
+    for edges in linked:
+        if len(edges.link_faces) < 2:
+            edges.select = True
+            for v in edges.verts:
+                if v is not v_active:
+                    c_verts.append(v)
+
+    # Compare distance in 2d between mouse and edges middle points
+    screen_pos_va = view3d_utils.location_3d_to_region_2d(region, region_3d,
+                                                          ob.matrix_world @ v_active.co)
+    screen_pos

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list