Skip to content

Instantly share code, notes, and snippets.

@SuddenDevelopment
Last active August 3, 2022 13:20
Show Gist options
  • Save SuddenDevelopment/13809d96ddff2780b9108629fdb4f3a4 to your computer and use it in GitHub Desktop.
Save SuddenDevelopment/13809d96ddff2780b9108629fdb4f3a4 to your computer and use it in GitHub Desktop.
Blender, Python, create 2d shape from 3d selected faces.
import bpy, bmesh, mathutils
# Blender script to get selected faces and create a new flat plan from the shapoe
def createDelaunay(points):
vs = [mathutils.Vector(co[:2]) for co in points]
# mathutils.geometry.delaunay_2d_cdt(vert_coords, edges, faces, output_type, epsilon, need_ids=True)
result = mathutils.geometry.delaunay_2d_cdt(vs, [], [], 0, 0.001)
vertices, edges, faces = result[:3]
return vertices, edges, faces
def fnTranslateVectors(arrVerts):
# Translate the vector into a flattened 2d coordinate
avg_normal = mathutils.Vector()
for v in arrVerts:
avg_normal += (v.normal / len(arrVerts))
rot_quat = avg_normal.rotation_difference((0, 0, 1))
return [(rot_quat @ v.co).to_2d() for v in arrVerts]
def createPolyPlane(vertices,edges,faces):
# make mesh
edges = []
new_mesh = bpy.data.meshes.new('new_mesh')
new_mesh.from_pydata(vertices, edges, faces)
new_mesh.update()
# make object from mesh
new_object = bpy.data.objects.new('new_object', new_mesh)
createDelaunay(vertices)
# make collection
new_collection = bpy.data.collections.new('new_collection')
bpy.context.scene.collection.children.link(new_collection)
# add object to scene collection
new_collection.objects.link(new_object)
# grab currentley selected mesh in edit mode
objMesh = bmesh.from_edit_mesh(bpy.context.edit_object.data)
# get all of the selected verts
arrVerts = []
for objVert in objMesh.verts:
if objVert.select == True:
arrVerts.append(objVert)
arrVerts = fnTranslateVectors(arrVerts)
# delaunay_2d_cdt only wants 2d coordinates, and we already have the translated, so just remove Z
vs = [vert.to_2d() for vert in arrVerts]
# pass in verts get back faces
verts_new, edges_new, faces_new = createDelaunay(vs)
# change verts back to 3d in a generic way
arrVerts = [vert.to_3d() for vert in verts_new]
createPolyPlane(arrVerts, edges_new, faces_new)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment