# How can I specify the position of vertices to create an object using Python?

I have generated a large matrix with the (x,y) positions of all 4 vertices of a rectangle, using a Python script. It's called Matrix1, and has the dimensions (265,2,4)- 265 rectangles, 4 vertices with their x coordinate in the first row, and the y co-ordinate in the second row respectively.

As I am new to Blender, I am unsure as to what commands I would use to actually create rectangles with those vertices.

Any help or assistance would be greatly appreciated. Thank you in advance!

For example:

[[0,1,1,0] [0,0,1,1]]

are the four vertices for the first rectangle, representing (0,0) (1,0), (1,1), (0,1); in general, if the order of vertices is [a,b,c,d] they should be joined to form edges ab, bc, cd, da.

• Something like this (for 2 rectangles)? [[(0, 0), (0, 1), (1, 0), (1, 1)], [(0, 0), (0, 1), (1, 0), (1, 1)]] Jul 3, 2016 at 17:56
• @batFINGER Yes, Matrix1 is exactly like that, but just for 1000 rectangles instead of just 2. My question is how would I go about setting those coordinates as the position of the vertices? Jul 3, 2016 at 17:57
• One mesh or separate mesh object per rectangle? Also do you know about the vert order? eg if the verts are [a, b, c, d] will the edges be [ab, bc, cd, da] ? Perhaps edit q with some sample data. Jul 3, 2016 at 18:05
• I added some details to the question. Please let me know if there's any additional information required. Jul 3, 2016 at 18:14

This Code will create the mesh object with your faces.
As for the Colors you will have to decide how you want to store them.
With a different material per face?
With vertex colors?
In an image (UVMapping)?
It depends on what you want to do with your Object as to which answer is best for you.

import bpy
import bmesh

vertlist = [[(0, 0), (0, 1), (1, 1), (1, 0)],
[(2, 2), (2, 3), (3, 3), (3, 2)]]

def create_mesh_object(context, vertlist):
bm = bmesh.new()

for faceverts in vertlist:
bm_verts = []
for vert in faceverts:
bm_verts.append(bm.verts.new((vert[0], vert[1], 0)))
bm.faces.new(bm_verts)

me = bpy.data.meshes.new(name='MyMesh')
ob = bpy.data.objects.new(name='MyObject', object_data=me)
bm.to_mesh(ob.data)

create_mesh_object(bpy.context, vertlist)


Code will create default plane primitive, then add a copy to scene, located and scaled to match each of your rectangles. This way all will share one mesh.

**(Assuming there's no rotation involved and that each is a rectangle)

import bpy
from mathutils import Vector
context = bpy.context
scene = context.scene
#define some rectangles
rectangles = [[(-1, -1), (1, -1), (-1, 1), (1, 1)],
[(9, -1), (11, -1), (9, 1), (11, 1)],
[(0, 0), (3, 0), (0, 9), (3, 9)]]

plane = context.active_object
# copy plane to each rect.
for rect in rectangles:
r = plane.copy()
verts = [Vector(v) for v in rect]
# location and scale for copy from data.
r.location.xy = sum(verts, Vector((0, 0))) / 4
r.scale.xy = ((verts[0] - verts[1]).length / 2,
(verts[1] - verts[3]).length / 2)

• Notice the difference between [[(0, 0), (0, 1), (1, 0), (1, 1)]] and [[0,1,1,0], [0,0,1,1]] .. if you are using data of this form it is what is causing the error. You edited the question and changed to this format 2hrs ago. Jul 5, 2016 at 19:27
• Put a print(rect) statement before 210. If it isn't of the form [(0, 0), (0, 1), (1, 1), (1, 0)] then you will need to edit YOUR code accordingly. Jul 5, 2016 at 19:51