Sunday, May 8, 2011

Selected from vertex groups

I tried another way to select faces with using vertex groups.

I made two vertex groups on the object, 'back' and 'leg'. And this code select vertices assigned 'back' group.


<CODE>


# First import bpy to get access to well... everything in blender
import bpy


# Now we want to get the active object
# To do this we go through bpy.context... because that is basicly "what you are working on right now"
# bpy.data could work too, but then you'd need to do more work to find your current active object
ob = bpy.context.active_object


# A new trick... lets go into edit mode and deselect everything ('SELECT' works too)
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='DESELECT')


# Get the screen areas we are working in right now
areas = bpy.context.screen.areas


# Loop through all the areas
for area in areas:


# See if the current area is a 3D view
if area.type == 'VIEW_3D':


# Set the pivot point to individual origins
area.active_space.pivot_point = 'INDIVIDUAL_ORIGINS'


# Select the vertex group 'back'
bpy.ops.object.vertex_group_set_active(group='back')
bpy.ops.object.vertex_group_select()


</CODE>


But I didn't success to extrude and resize the selected faces. If I could connect to the Dolf's script on May 5th well, I'll advance more one step.

P.S.
This part of Dolf's script, 'if ~', could be change to 'a face is already selected', I think 'mygroup' could be made from the selected faces. How about it?

<CODE>


# Now loop through all the faces
for i, f in enumerate(ob.data.faces):
    
    # The following is the same as i % 5 == 0, but faster.
    if not i % 5:
        
        # Create a new vertex group!
        newGroup = ob.vertex_groups.new('mygroup')
        groupList.append(newGroup)
        
        # Get all the vertices in the current face and add them to the new group
        for v in f.vertices:
            newGroup.add([v], 1.0, 'REPLACE')
         
</CODE>

And I re-write this part to this,

<CODE>


 # If this face is selected~
    if ob.data.faces[i].select == True:


</CODE>

Yes! I got a good result! It's like this.


How about this? It's a very big step for me. The all code is this.

<CODE>

# First import bpy to get access to well... everything in blender
import bpy

# Now we want to get the active object
# To do this we go through bpy.context... because that is basicly "what you are working on right now"
# bpy.data could work too, but then you'd need to do more work to find your current active object
ob = bpy.context.active_object

# A new trick... lets go into edit mode and deselect everything ('SELECT' works too)
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='DESELECT')

# Get the screen areas we are working in right now
areas = bpy.context.screen.areas

# Loop through all the areas
for area in areas:

# See if the current area is a 3D view
if area.type == 'VIEW_3D':

# Set the pivot point to individual origins
area.active_space.pivot_point = 'INDIVIDUAL_ORIGINS'

# Select the vertex group 'back'
bpy.ops.object.vertex_group_set_active(group='back')
bpy.ops.object.vertex_group_select()

# Go into object mode so that we are sure we have the current list of faces 
bpy.ops.object.mode_set(mode='OBJECT')

# Make a nice list to keep the vertex groups in
groupList = []

# Now loop through all the faces
for i, f in enumerate(ob.data.faces):
    
    # If this face is selected~
    if ob.data.faces[i].select == True:
        
        # Create a new vertex group!
        newGroup = ob.vertex_groups.new('mygroup')
        groupList.append(newGroup)
        
        # Get all the vertices in the current face and add them to the new group
        for v in f.vertices:
            newGroup.add([v], 1.0, 'REPLACE')
            

# Now we loop through the groups and do what we want.
for g in groupList:
    
    # Make sure nothing is selected
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.select_all(action='DESELECT')
    
    # Make the group in our list the active one
    ob.vertex_groups.active_index = g.index
    
    # Select all the verts in the active group
    bpy.ops.object.vertex_group_select()
    
    # AND NOW WE CAN DO OUR STUFF... little test example follows
    
    # Lets extrude/shrink/scale 5 times (hacky non commented code)
    for i in range(5):
        
        bpy.ops.mesh.extrude(type='REGION')
        
        # An added trick... remove the extruded face from all vertex groups after the first extrusion (i == 0)
        # This way it can't get extruded again
        # Because the edge of the first face can be part of multiple groups
        if not i:
            bpy.ops.object.vertex_group_remove_from(all=True)
        
        bpy.ops.object.mode_set(mode='OBJECT')
        
        bpy.ops.object.mode_set(mode='EDIT')
        
        bpy.ops.transform.shrink_fatten(value=-0.1, mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1, snap=False, snap_target='CLOSEST', snap_point=(0, 0, 0), snap_align=False, snap_normal=(0, 0, 0), release_confirm=False)
        
        bpy.ops.transform.resize(value=(0.8, 0.8, 0.8), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=0.0762767, snap=False, snap_target='CLOSEST', snap_point=(0, 0, 0), snap_align=False, snap_normal=(0, 0, 0), texture_space=False, release_confirm=False)


</CODE>

No comments:

Post a Comment