Strange unexplainable error

Hi. I am new to python but i have been using C, C++ & C# for years.
I am trying to create and importer for proprietary models and animation (Game engine) so i have been trying out some code


#---------------------------------------------------
# File armature.py
#---------------------------------------------------
import bpy, math
from mathutils import Vector, Matrix, Euler
 
def createRig(name, origin, boneTable):
    # Create armature and object
    bpy.ops.object.add(
        type='ARMATURE', 
        enter_editmode=True,
        location=origin)
    ob = bpy.context.object
    ob.show_x_ray = True
    ob.name = name
    amt = ob.data
    amt.name = name+'Amt'
    amt.show_axes = True
 
    # Create bones
    bpy.ops.object.mode_set(mode='EDIT')
    for (bname, pname, vector) in boneTable:        
        bone = amt.edit_bones.new(bname)
        #vector = (vector[0],vector[2],vector[1])
        if pname:
            parent = amt.edit_bones[pname]
            bone.parent = parent
            bone.head = parent.tail
            bone.use_connect = False
            (trans, rot, scale) = parent.matrix.decompose()
        else:
            bone.head = (0,0,0)
            # rtt = Matrix.Rotation(0,radians(90),0)
            rot = Matrix.Translation((0,0,0))	# identity matrix
        #bone.tail = rot * Vector(vector) + bone.head
        bone.tail = Vector(vector) + bone.head
    bpy.ops.object.mode_set(mode='OBJECT')
    return ob
 
def poseRig(ob, poseTable):
    bpy.context.scene.objects.active = ob
    bpy.ops.object.mode_set(mode='POSE')
 
    for (bname, angle) in poseTable:
        pbone = ob.pose.bones[bname] #errrorrrr
        # Set rotation mode to Euler XYZ, easier to understand
        # than default quaternions
        pbone.rotation_mode = 'XYZ'
        # Documentation bug: Euler.rotate(angle,axis):
        # axis in ['x','y','z'] and not ['X','Y','Z']
        pbone.rotation_euler = Euler((angle),'XYZ') 
    bpy.ops.object.mode_set(mode='OBJECT')
 
def run(origo):
    origin = Vector(origo)
    # Table of bones in the form (bone, parent, vector)
    # The vector is given in local coordinates
    boneTable1 = [
        ('root_main',None, (0.000000, 0.000000, 0.000000)),
        ('sk_root_hip','root_main', (0.000000, 1.096121, 0.000000)),
        ('dsk_hip','sk_root_hip', (0.105644, 0.000000, 0.000000)),
        ('sk_thigh_l','dsk_hip', (-0.019242, 0.075753, 0.090000)),
        ('sk_leg_l','sk_thigh_l', (0.421257, 0.000000, 0.000000)),
        ('sk_foot_l','sk_leg_l', (0.441786, 0.000000, 0.000000)),
        ('heel_l','sk_foot_l', (0.016031, -0.107840, 0.000000)),
        ('toe_l','heel_l', (0.000000, 0.000000, 0.161595)),
        ('sk_thigh_r','dsk_hip', (-0.019242, 0.075753, -0.090000)),
        ('sk_leg_r','sk_thigh_r', (0.421257, 0.000000, 0.000000)),
        ('sk_foot_r','sk_leg_r', (0.441786, 0.000000, 0.000000)),
        ('heel_r','sk_foot_r', (0.016031, -0.107819, -0.002140)),
        ('toe_r','heel_r', (0.000000, 0.000000, 0.161594)),
        ('sk_belly','sk_root_hip', (-0.000001, 0.000000, 0.000000)),
        ('sk_chest','sk_belly', (0.167222, 0.000000, 0.000000)),
        ('sk_neck','sk_chest', (0.269976, 0.003474, -0.000001)),
        ('sk_head','sk_neck', (0.110000, 0.000000, 0.000000)),
        ('sk_shoulder_l','sk_chest', (0.205214, -0.002096, -0.105080)),
        ('sk_upperarm_l','sk_shoulder_l', (0.089920, 0.000000, 0.000000)),
        ('sk_forearm_l','sk_upperarm_l', (0.290000, 0.000000, 0.000000)),
        ('sk_hand_l','sk_forearm_l', (0.290000, 0.000000, 0.000000)),
        ('finger_l','sk_hand_l', (0.125097, 0.001092, 0.000000)),
        ('sk_shoulder_r','sk_chest', (0.205216, -0.002096, 0.105082)),
        ('sk_upperarm_r','sk_shoulder_r', (0.089920, 0.000000, 0.000000)),
        ('sk_forearm_r','sk_upperarm_r', (0.290000, 0.000000, 0.000000)),
        ('sk_hand_r','sk_forearm_r', (0.290001, 0.000000, 0.000000)),
        ('finger_r','sk_hand_r', (0.125091, 0.001092, 0.000000))
    ]
    bent = createRig('Bent', origin, boneTable1)


    # Pose first rig
    poseTable1 = [
        ('root_main',(0.000000, 0.000000, 0.000000)),
        ('sk_root_hip',(0.000000, -90.000000, -100.003000)),
        ('dsk_hip',(0.000000, -180.000000, 0.000000)),
        ('sk_thigh_l',(0.001984, 179.988700, 14.785900)),
        ('sk_leg_l',(0.002106, 0.022232, -10.845950)),
        ('sk_foot_l',(0.000900, -0.010864, 65.306980)),
        ('heel_l',(-30.756070, 90.000000, 0.000000)),
        ('toe_l',(0.000000, 0.000000, 0.000000)),
        ('sk_thigh_r',(-0.001984, -179.988700, 14.785890)),
        ('sk_leg_r',(-0.002106, -0.022217, -10.845950)),
        ('sk_foot_r',(-0.475952, -1.022339, 65.311250)),
        ('heel_r',(-30.749390, 89.323330, 1.323273)),
        ('toe_r',(0.000015, -0.000015, 0.000000)),
        ('sk_belly',(0.000000, 0.000000, -174.728500)),
        ('sk_chest',(0.000000, -0.000488, -0.184631)),
        ('sk_neck',(0.000000, 0.000504, -6.018188)),
        ('sk_head',(0.000000, 0.000000, 10.934170)),
        ('sk_shoulder_l',(4.916138, -89.999510, -180.000000)),
        ('sk_upperarm_l',(0.000000, -0.000015, -5.500000)),
        ('sk_forearm_l',(-0.000015, 0.000076, 15.000000)),
        ('sk_hand_l',(0.000000, -0.000046, -10.000000)),
        ('finger_l',(0.000000, 0.000000, 0.000000)),
        ('sk_shoulder_r',(-4.916138, 90.000490, -179.999800)),
        ('sk_upperarm_r',(0.000000, 0.000031, -5.500244)),
        ('sk_forearm_r',(0.000000, -0.000076, 15.000000)),
        ('sk_hand_r',(0.000015, 0.000061, -10.000000)),
        ('finger_r',(0.000000, 0.000000, 0.000000))
    ]
    poseRig(bent, poseTable1)
 
if __name__ == "__main__":
    run((0,0,0))



I wrote the above code based on one of the examples in the wiki but for some strange reason this line give me an error

        pbone = ob.pose.bones[bname] 

I am a bit confused. what did i do wrong?

Hi

blender doesn’t like zero length bones.

Try adding some arbitrary length to the root_main and sk_belly bones.


('root_main',None, (0.000000, 0.000000, 1.000000)),

zero-length bones are automatically removed, leading to strange behavior in import code. There’s a hack in one of importers (BVH?), which gives bones a very little length in a random direction to circumvent your problem.