import bpy
import bmesh
verts = (
( -12.774209, -12.774209, -12.774209),
( -12.774209, +12.774209, -12.774209),
( +0.000000, -17.121244, -17.121244),
( +0.000000, +17.121244, -17.121244),
( +12.774209, -12.774209, -12.774209),
( +12.774209, +12.774209, -12.774209),
( -17.121244, -17.121244, +0.000000),
( -17.121244, +17.121244, +0.000000),
( -0.000000, -24.685204, -0.000000),
( -0.000000, +24.685204, -0.000000),
( +17.121244, -17.121244, +0.000000),
( +17.121244, +17.121244, +0.000000),
( -12.774209, -12.774209, +12.774209),
( -12.774209, +12.774209, +12.774209),
( -0.000000, -17.121244, +17.121244),
( +0.000000, +17.121244, +17.121244),
( +12.774209, -12.774209, +12.774209),
( +12.774209, +12.774209, +12.774209),
( -17.121244, +0.000000, -17.121244),
( +17.121244, +0.000000, -17.121244),
( -24.685204, -0.000000, -0.000000),
( +24.685204, -0.000000, -0.000000),
( -17.121244, +0.000000, +17.121244),
( +17.121244, +0.000000, +17.121244),
( +0.000000, -0.000000, -24.685204),
( -0.000000, -0.000000, +24.685204),
)
faces = (
(3, 1, 19, 25),
(1, 3, 9, 7),
(1, 7, 21, 19),
(7, 9, 15, 13),
(7, 13, 23, 21),
(13, 15, 26, 23),
(25, 19, 2, 4),
(19, 21, 8, 2),
(21, 23, 14, 8),
(23, 26, 16, 14),
(8, 10, 4, 2),
(14, 16, 10, 8),
(5, 3, 25, 20),
(3, 5, 11, 9),
(9, 11, 17, 15),
(15, 17, 24, 26),
(20, 25, 4, 6),
(26, 24, 18, 16),
(10, 12, 6, 4),
(16, 18, 12, 10),
(11, 5, 20, 22),
(17, 11, 22, 24),
(22, 20, 6, 12),
(24, 22, 12, 18),
)
bm = bmesh.new()
for v in verts:
bm.verts.new(v)
bm.verts.ensure_lookup_table()
for f in faces:
bm.faces.new(bm.verts[vi-1] for vi in f)
me = bpy.data.meshes.new("")
bm.to_mesh(me)
ob = bpy.data.objects.new("", me)
scene = bpy.context.scene
scene.objects.link(ob)
scene.update()
But standard API is probably more efficient:
import bpy
def accumulate(iterable):
it = iter(iterable)
total = 0
for element in it:
yield total
total += element
verts = (
( -12.774209, -12.774209, -12.774209),
( -12.774209, +12.774209, -12.774209),
( +0.000000, -17.121244, -17.121244),
( +0.000000, +17.121244, -17.121244),
( +12.774209, -12.774209, -12.774209),
( +12.774209, +12.774209, -12.774209),
( -17.121244, -17.121244, +0.000000),
( -17.121244, +17.121244, +0.000000),
( -0.000000, -24.685204, -0.000000),
( -0.000000, +24.685204, -0.000000),
( +17.121244, -17.121244, +0.000000),
( +17.121244, +17.121244, +0.000000),
( -12.774209, -12.774209, +12.774209),
( -12.774209, +12.774209, +12.774209),
( -0.000000, -17.121244, +17.121244),
( +0.000000, +17.121244, +17.121244),
( +12.774209, -12.774209, +12.774209),
( +12.774209, +12.774209, +12.774209),
( -17.121244, +0.000000, -17.121244),
( +17.121244, +0.000000, -17.121244),
( -24.685204, -0.000000, -0.000000),
( +24.685204, -0.000000, -0.000000),
( -17.121244, +0.000000, +17.121244),
( +17.121244, +0.000000, +17.121244),
( +0.000000, -0.000000, -24.685204),
( -0.000000, -0.000000, +24.685204),
)
faces = (
(3, 1, 19, 25),
(1, 3, 9, 7),
(1, 7, 21, 19),
(7, 9, 15, 13),
(7, 13, 23, 21),
(13, 15, 26, 23),
(25, 19, 2, 4),
(19, 21, 8, 2),
(21, 23, 14, 8),
(23, 26, 16, 14),
(8, 10, 4, 2),
(14, 16, 10, 8),
(5, 3, 25, 20),
(3, 5, 11, 9),
(9, 11, 17, 15),
(15, 17, 24, 26),
(20, 25, 4, 6),
(26, 24, 18, 16),
(10, 12, 6, 4),
(16, 18, 12, 10),
(11, 5, 20, 22),
(17, 11, 22, 24),
(22, 20, 6, 12),
(24, 22, 12, 18),
)
me = bpy.data.meshes.new("")
me.vertices.add(len(verts))
me.vertices.foreach_set("co", [vv for v in verts for vv in v])
me.loops.add(sum(len(f) for f in faces))
me.loops.foreach_set("vertex_index", [ff-1 for f in faces for ff in f])
me.polygons.add(len(faces))
me.polygons.foreach_set("loop_start", list(accumulate(len(f) for f in faces)))
me.polygons.foreach_set("loop_total", [len(f) for f in faces])
#me.validate(True)
me.update(calc_edges=True)
ob = bpy.data.objects.new("", me)
scene = bpy.context.scene
scene.objects.link(ob)
scene.update()
Or if verts and faces is the only thing you wanna create (no uv mapping etc.), just do:
import bpy
verts = (
( -12.774209, -12.774209, -12.774209),
( -12.774209, +12.774209, -12.774209),
( +0.000000, -17.121244, -17.121244),
( +0.000000, +17.121244, -17.121244),
( +12.774209, -12.774209, -12.774209),
( +12.774209, +12.774209, -12.774209),
( -17.121244, -17.121244, +0.000000),
( -17.121244, +17.121244, +0.000000),
( -0.000000, -24.685204, -0.000000),
( -0.000000, +24.685204, -0.000000),
( +17.121244, -17.121244, +0.000000),
( +17.121244, +17.121244, +0.000000),
( -12.774209, -12.774209, +12.774209),
( -12.774209, +12.774209, +12.774209),
( -0.000000, -17.121244, +17.121244),
( +0.000000, +17.121244, +17.121244),
( +12.774209, -12.774209, +12.774209),
( +12.774209, +12.774209, +12.774209),
( -17.121244, +0.000000, -17.121244),
( +17.121244, +0.000000, -17.121244),
( -24.685204, -0.000000, -0.000000),
( +24.685204, -0.000000, -0.000000),
( -17.121244, +0.000000, +17.121244),
( +17.121244, +0.000000, +17.121244),
( +0.000000, -0.000000, -24.685204),
( -0.000000, -0.000000, +24.685204),
)
faces = (
(3, 1, 19, 25),
(1, 3, 9, 7),
(1, 7, 21, 19),
(7, 9, 15, 13),
(7, 13, 23, 21),
(13, 15, 26, 23),
(25, 19, 2, 4),
(19, 21, 8, 2),
(21, 23, 14, 8),
(23, 26, 16, 14),
(8, 10, 4, 2),
(14, 16, 10, 8),
(5, 3, 25, 20),
(3, 5, 11, 9),
(9, 11, 17, 15),
(15, 17, 24, 26),
(20, 25, 4, 6),
(26, 24, 18, 16),
(10, 12, 6, 4),
(16, 18, 12, 10),
(11, 5, 20, 22),
(17, 11, 22, 24),
(22, 20, 6, 12),
(24, 22, 12, 18),
)
me = bpy.data.meshes.new("")
me.from_pydata(verts, [],
[list(map(lambda x: x-1, f)) for f in faces])
#me.validate(True)
me.update(calc_edges=True)
ob = bpy.data.objects.new("", me)
scene = bpy.context.scene
scene.objects.link(ob)
scene.update()