diff --git a/blender_scraps/scratch.py b/blender_scraps/scratch.py new file mode 100644 index 0000000..06780d3 --- /dev/null +++ b/blender_scraps/scratch.py @@ -0,0 +1,79 @@ +# This is a pile of patterns and snippets I've used in Blender in the +# past; it isn't meant to be run on its own. + +import bmesh +import bpy + +# Here is a good starting place (re: creating geometry): +# https://docs.blender.org/api/current/info_gotcha.html#n-gons-and-tessellation + +# https://wiki.blender.org/wiki/Source/Modeling/BMesh/Design + +# Current object's data (must be selected): +me = bpy.context.object.data + +def bmesh_set_creases(obj, vert_pairs, crease_val): + # Walk through the edges in 'obj'. For those *undirected* edges in + # 'vert_pairs' (a set of (vi, vj) tuples, where vi and vj are vertex + # indices, and tuple order is irrelevant), set the crease to 'crease_val'. + bm = bmesh.new() + bm.from_mesh(obj) + creaseLayer = bm.edges.layers.crease.verify() + for e in bm.edges: + idxs = tuple([v.index for v in e.verts]) + print(idxs) + if idxs in vert_pairs or idxs[::-1] in vert_pairs: + e[creaseLayer] = crease_val + bm.to_mesh(obj) + bm.free() + +# My bpy.types.MeshPolygon objects: +for i,poly in enumerate(me.polygons): + t = type(poly) + #print(f"poly {i}: {t}") + verts = list(poly.vertices) + print(f"poly {poly.index}: vertices={verts}") + #s = poly.loop_start + #n = poly.loop_total + #print(f" loop_start={s} loop_total={n}") + #v = [l.vertex_index for l in me.loops[s:(s+n)]] + #print(f" loop: {v}") + # Vector type: + v2 = [me.vertices[i].co for i in verts] + print(f" verts: {v2}") + # Yes, this works: + #for i in verts: + # me.vertices[i].co.x -= 1.0 + +# Pattern for loading external module from Blender's Python (and +# reloading as necessary): +import sys +ext_path = "/home/hodapp/source/automata_scratch/blender_scraps" +if ext_path not in sys.path: + sys.path.append(ext_path) +import whatever +whatever = importlib.reload(whatever) +# Note that if 'whatever' itself imports modules that may have changed +# since the last import, you may need to do this same importlib +# incantation! + +# Crease access - but the wrong way to change them: +for edge in me.edges: + v = list(edge.vertices) + print(f"edge {edge.index}: crease={edge.crease} vertices={v}") + #edge.crease = 0.7 + +# Creating a mesh with vertices & faces in Python via bpy with: +# v - list of (x, y, z) tuples +# f - list of (v0, v1, v2...) tuples, each with face's vertex indices +mesh = bpy.data.meshes.new('mesh_thing') +mesh.from_pydata(v, [], f) +mesh.update(calc_edges=True) +# set creases beforehand: +#bmesh_set_creases(mesh, b.creases_joint, 0.7) +obj = bpy.data.objects.new('obj_thing', mesh) +# set obj's transform matrix: +#obj.matrix_world = Matrix(...) +# also acceptable to set creases: +#bmesh_set_creases(obj.data, b.creases_joint, 0.7) +bpy.context.scene.collection.objects.link(obj)