Blenderスクリプトで頂点、辺、面を登録する
from_pydata()を使って頂点、辺、面を登録するBlenderスクリプトのサンプルです。
ソースコードの全文はページ下のほうにあります。
頂点を登録する
vertsは頂点XYZ座標を配列の配列で格納します。
append(), extend()を使って配列にデータを格納します。
	verts = []
        verts.append( [ -1, 1, 0 ] )
        verts.append( [  1, 1, 0 ] )
        verts.append( [  1, -1, 0 ] )
        verts.append( [ -1, -1, 0 ] )
        n_mesh = bpy.data.meshes.new("new_mesh")
	n_mesh.from_pydata(verts, [], [])
        n_mesh.update()
        object_utils.object_data_add(context, n_mesh, operator=None)
配列データまとめて登録する場合は、extend()を使います。
        verts.extend( [ [ -1, 1, 0 ], [ 1, 1, 0 ],[ 1, -1, 0 ], [ -1, -1, 0 ] ] )
辺を登録する
edgesには始点と終点の頂点インデックス(vertsの配列番号)を格納します。
    verts = []
    verts.extend( [ [ -1, 1, 0 ], [ 1, 1, 0 ],[ 1, -1, 0 ], [ -1, -1, 0 ] ] )
	edges = []
    edges.extend( [ [ 0,1 ], [ 1,2 ],[ 2,3 ], [ 3,0 ] ] )
        n_mesh = bpy.data.meshes.new("new_mesh")
	n_mesh.from_pydata(verts, edges, [])
        n_mesh.update()
        object_utils.object_data_add(context, n_mesh, operator=None)
面を登録する
        facesもedgeと同様、頂点インデックスを格納します。
	
from_pydata()はエッジと面の両方を登録するとデータが壊れるので注意してください
	5点以上で構成するの面を登録する場合は特に注意してください。
	面を登録する場合、エッジは自動計算にします。
    verts = []
    verts.extend( [ [ -1, 1, 0 ], [ 1, 1, 0 ],[ 1, -1, 0 ], [ -1, -1, 0 ] ] )
        faces = []
        faces.append( [0,1,2,3] )
        n_mesh = bpy.data.meshes.new("new_mesh")
	n_mesh.from_pydata(verts, [], faces)
        n_mesh.update(calc_edges=True)
        object_utils.object_data_add(context, n_mesh, operator=None)
ソースコード
正方形の頂点、辺、面を登録するスクリプト
#This source code is able to freely use for Blender and users.
bl_info = {
    "name": "Add mesh sample",
    "author": "TMO",
    "version": (0, 1, 0),
    "blender": (2, 6, 0),
    "location": "View3D > Add > Mesh > Add mesh sample",
    "description": "Sample of add mesh.",
    "warning": "",
    "wiki_url": "http://www.sousakuba.com/blender/index.html",
    "tracker_url": "",
    "category": "Add Mesh"}
import bpy
from bpy_extras import object_utils
class main(bpy.types.Operator):
    bl_idname="mesh.add_mesh_sample"
    bl_label="Add mesh sample"
    bl_options = {'REGISTER', 'UNDO'}
    def execute(self, context):
        plane_size = 1.0;
        verts = []
        edges = []
        faces = []
        verts.append( [ -plane_size, plane_size, 0 ] )
        verts.append( [  plane_size, plane_size, 0 ] )
        verts.append( [  plane_size, -plane_size, 0 ] )
        verts.append( [ -plane_size, -plane_size, 0 ] )
        edges.extend( [ [ 0,1 ], [ 1,2 ],[ 2,3 ], [ 3,0 ] ] )
        faces.append( [0,1,2,3] )
        add_mode = 2
        if add_mode == 0:
            #add vertex
            new_mesh = bpy.data.meshes.new("mesh")
            new_mesh.from_pydata(verts, [], [])
            new_mesh.update()
            object_utils.object_data_add(context, new_mesh, operator=None)
        elif add_mode == 1:
            #add edge
            new_mesh = bpy.data.meshes.new("mesh")
            new_mesh.from_pydata(verts, edges, [])
            new_mesh.update()
            object_utils.object_data_add(context, new_mesh, operator=None)
        else:
            #add face
            new_mesh = bpy.data.meshes.new("mesh")
            new_mesh.from_pydata(verts, [], faces)
            new_mesh.update(calc_edges=True)
            object_utils.object_data_add(context, new_mesh, operator=None)
        return {'FINISHED'}
def menu_func(self, context):
    self.layout.operator(main.bl_idname, main.bl_label, icon="PLUGIN")
def register():
    bpy.utils.register_module(__name__)
    bpy.types.INFO_MT_mesh_add.append(menu_func)
def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.INFO_MT_mesh_add.remove(menu_func)
if __name__ == "__main__":
    register()