0
$\begingroup$

I am new to Blender. I have 2 objects (e.g 2 box mesh) I would like to export their properties as obj file using python scripting. I would like to export the vertex of both objects firstly, followed by their faces. This is the code I am using below

import bpy

obj = list(bpy.data.objects)

    print("Cube\n")
    for a in obj:
        mesh =a.data
        for v in mesh.vertices:
        #random output compared to what we have in the original file
            print("v %.4f %.4f %.4f\n" % v.co[:]) #x,y,z coordinates     
    
    print("\n # 8 vertices\n")
    for a in obj:
        mesh =a.data
    
        print( "g " +a.name+ "\n")
        for p in mesh.polygons:             
            print("f")
            for i in p.vertices: 
                print(" %d" % (i + 1))  
            print( "\n")
OUTPUT
g.cube 1

f 1 2 4 3
f 3 4 8 7
f 7 8 6 5
f 5 6 2 1
f 3 7 5 1
f 8 4 2 6

g Cube.002

f 1 2 4 3
f 3 4 8 7
f 7 8 6 5
f 5 6 2 1
f 3 7 5 1
f 8 4 2 6

Both faces of both objects are the same. This is not what I want. I would like the faces of the second object to start from 9 and so on.

How do I go about this?

$\endgroup$
2
  • 2
    $\begingroup$ Each mesh has its own face indexation, meaning it will only contain indices between 0 and its number of vertices -1 (NOT guaranteed though because a mesh can contain vertices which are not linked to a face). If you want to add to that, you can use a global counter before the for a in obj: loop, which will be incremented after by len(mesh.vertices) for each successive object. As I said you might skip some vertices, but not knowing more about your end goal it's hard to give more precise information $\endgroup$
    – Gorgious
    Jul 18 '21 at 21:19
  • $\begingroup$ You might save time to base your code in the original OBJ exporter as it is written in python. $\endgroup$
    – TheLabCat
    Jul 18 '21 at 23:49
0
$\begingroup$

Make a joined bmesh.

At the risk of not re-inventing the wheel, since blender ships with an OBJ exporter

As shown in [find link re joining bmeshes] can read multiple meshes into one bmesh.

  • Start with a dummy vert to move indexing up 1

  • Update normals after reading mesh to update indices. Possibly other ways to do this.

  • Increment the edge count.

Test script.

import bpy
import bmesh

context = bpy.context

bm = bmesh.new()
bm.verts.new() # since you are indexing from 1
index = 0
for ob in context.selected_objects:
    
    if not ob.type == 'MESH':
        continue
    print()
    print(f"o {ob.name}")
    print()
    bm.from_mesh(ob.data)
    # use normal update to force re-index
    bm.normal_update()
    for f in bm.faces[index:]:
        print(f"f {' '.join(str(v.index) for v in f.verts)}")
    index += len(bm.faces)

Test output.

o Cube

f 1 2 3 4
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8

o Cube.001

f 9 10 11 12
f 13 16 15 14
f 9 13 14 10
f 10 14 15 11
f 11 15 16 12
f 13 9 12 16

Ultimately would join them all into one bmesh, call the normal update once. Use meshes geom counts to slice.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.