1

I've been playing with duplifaces and it turns out the orientation of the copied geometry depends on the order of the vertices in the face (https://developer.blender.org/T30547). Since I'm unhappy with the orientation of some of my duplicated geometry, clearly I need to "rotate" the vertex order of some of the faces.

I've come up with this little python snippet, but it has one drawback I can think of.

# rotate selected face

import bpy
import bmesh

mesh = bpy.context.active_object.data
bm = bmesh.from_edit_mesh(mesh)

for face in bm.faces:
    if (face.select):
        vs = face.verts[:]
        vs2 = vs[1:]+vs[:1]
        # face.verts =vs2 # fails because verts is read-only
        bm.faces.remove(face)
        f2 = bm.faces.new(vs2)
        f2.select = True

# trigger UI update    
bmesh.update_edit_mesh(mesh)

The drawback is that it destroys the old face and creates a new one. I suspect that there will be some cases where information on the old face will be lost.

Just for some flavor, here's an illustration of a situation where you might want manual control over the orientation: enter image description here

CodeManX
  • 29,298
  • 3
  • 89
  • 128
Mutant Bob
  • 9,243
  • 2
  • 29
  • 55
  • 1
    JA12 put together a short video that illustrates some workflow techniques to control this if you are building new geometry: – Mutant Bob May 17 '14 at 19:38
  • There is a tool to help re-order mesh elements, which can be accessed in the GUI with Space > Sort Mesh elements (you must be in edit mode), or in python with bpy.ops.mesh.sort_elements(). Unfortunately it didn't seem to affect duplifaces, at least it didn't when I tried it.. – gandalf3 May 19 '14 at 19:20
  • Even if Sort Mesh Elements were to affect the vertex order on a face, there's only a 1/4 chance that the order of the vertices is the order you want. I think it would require a new operator, but I'm disinclined to start work on a new patch until my other patch gets accepted, or even rejected. – Mutant Bob May 20 '14 at 14:34
  • Do you actually want to rotate the faces, or do you want to flip the normals (so the orientation the polygon is facing)? There are bmesh.utils.face_flip(), bmesh.ops.rotate_edges() and bmesh.utils.edge_rotate(), which might do what you want. – CodeManX Aug 18 '14 at 17:48

1 Answers1

2

The UI isn't updating because the script does not call

bmesh.update_edit_mesh(mesh)

(I got this from how to use BMesh to add verts, faces, and edges to existing geometry )

Mutant Bob
  • 9,243
  • 2
  • 29
  • 55