I'm new to blender as I am trying to create a simple Robot skeleton using the Blender Python API (bpy). However, when I run the python script the console spits out the following error:
Traceback (most recent call last): File "", line 1, in NameError: name 'Robot' is not defined
How can I fix this error? I don't understand what it means when it says that the name 'Robot' is now defined. I am also using Blender 2.7.7 on Ubuntu 18.04
The following is my code:
import bpy
#this function will draw a cylinder and cut portions from opposite sides to create the base plate
def Draw_Base_Plate():
#create two cubes and then we'll "Subtract" them from the base plate
#then we will delete the cubes
bpy.ops.mesh.primitive_cube_add(radius = 0.05, location = (0.175, 0, 0.09))
bpy.ops.mesh.primitive_cube_add(radius = 0.05, location = (-0.175, 0, 0.09))
############################################################################
#adding the base plate itself
bpy.ops.mesh.primitive_cylinder_add(radius = 0.15, depth = 0.05, location = (0,0,0.09))
#adding boolean difference modifier from the first cube
bps.ops.object.modifier_add(type = 'BOOLEAN')
bpy.context.object.modifiers["Boolean"].operation = 'DIFFERENCE'
bpy.context.object.modifiers["Boolean"].object = bpy.data.objects["Cube"]
bpy.ops.object.modifier_apply(modifier = "Boolean")
###########################################################################
#adding boolean difference modifier from the second cube
bps.ops.object.modifier_add(type = 'BOOLEAN')
bpy.context.object.modifiers["Boolean"].operation = 'DIFFERENCE'
bpy.context.object.modifiers["Boolean"].object = bpy.data.objects["Cube.001"]
bpy.ops.object.modifier_apply(modifier = "Boolean")
###########################################################################
#deselect cylinder and delete cubes
bpy.ops.object.select_pattern(pattern = "Cube")
bpy.ops.object.select_pattern(pattern = "Cube.001")
bpy.data.objects['Cylinder'].select = False
bpy.ops.object.delete(use_global = False)
###########################################################################
#this function will motors and wheels attached to the base plate
def Draw_Motor_Wheels():
#draw a cylinder with 0.045 of radius and 0.01 meters in depth for the wheels
#once we create the wheels it will be rotated and translated into the
#cut portion of the base plate
#create first wheel
bpy.ops.mesh.primitive_cylinder_add(radius = 0.045, depth = 0.01, location = (0,0,0.07))
#rotate the first wheel
bpy.context.object.rotation_euler[1] = 1.5708 #is this pi/2
#translate
bpy.context.object.location[0] = 0.135
#create second wheel
bpy.ops.mesh.primitive_cylinder_add(radius = 0.045, depth = 0.01, location = (0,0,0.07))
#rotate the first wheel
bpy.context.object.rotation_euler[1] = 1.5708 #is this pi/2
#translate
bpy.context.object.location[0] = -0.135
#now we can create the two dummy motors and add them onto the base plate
#adding motors
bpy.ops.mesh.primitive_cylinder_add(radius = 0.018, depth = 0.06, location = (0.075,0,0.075))
bpy.context.object.rotation_euler[1] = 1.5708 #pi/2 rotation?
bpy.ops.mesh.primitive_cylinder_add(radius = 0.018, depth = 0.06, location = (-0.075,0,0.075))
bpy.context.object.rotation_euler[1] = 1.5708 #pi/2 rotation?
#now we will add the shafts to the motors
#shaft 1
bpy.ops.mesh.primitive_cylinder_add(radius = 0.006, depth = 0.04, location = (0.12, 0,0.075))
bpy.context.object.rotation_euler[1] = 1.5708
#shaft 2
bpy.ops.mesh.primitive_cylinder_add(radius = 0.006, depth = 0.04, location = (-0.12, 0,0.075))
bpy.context.object.rotation_euler[1] = 1.5708
#now we can add the 2 caster wheels
bpy.ops.mesh.primitive_cylinder_add(radius = 0.015, depth = 0.05, location = (0,0.125,0.065))
bpy.ops.mesh.primitive_cylinder_add(radius = 0.015, depth = 0.05, location = (0,-0.125, 0.065))
#now we'll add a dummy kinect sensor
bpy.ops.mesh.primitive_cube_add(radius = 0.04, location = (0,0, 0.26))
#this function will draw the middle plate of the robot
def Draw_Middle_Plate():
bpy.ops.mesh.primitive_cylinder_add(radius = 0.15, depth = 0.005, location = (0, 0, 0.22))
#this function will draw the top plate of the robot
def Draw_Top_Plate():
bpy.ops.mesh.primitive_cylinder_add(radius = 0.15, depth = 0.005, location = (0, 0, 0.37))
#this function will draw support tubes connecting the plates of the robot
def Draw_Support_Tubes():
bpy.ops.mesh.primitive_cylinder_add(radius = 0.007, depth = 0.3, location = (0.09, 0.09, 0.23))
bpy.ops.mesh.primitive_cylinder_add(radius = 0.007, depth = 0.3, location = (-0.09, 0.09, 0.23))
bpy.ops.mesh.primitive_cylinder_add(radius = 0.007, depth = 0.3, location = (-0.09, -0.09, 0.23))
bpy.ops.mesh.primitive_cylinder_add(radius = 0.007, depth = 0.3, location = (0.09, -0.09, 0.23))
#This function will export the newly designed robot to .STL, but we have to change the STL filepath
#executing the script
def Save_to_STL():
bpy.ops.object.select_all(action = 'SELECT')
#bpy.ops.object.select_all(action = 'TOGGLE')
bpy.ops.export_mesh.stl(check_existing = True, filepath = "/home/robertek/Desktop/exported.stl", filter_glob = "*.stl", ascii = False, use_mesh_modifiers = True, axis_forward = 'Y', axis_up = 'Z', global_scale = 1.0)
#Main body code
if __name__ == "__main__":
Draw_Base_Plate()
Draw_Motors_Wheels()
Draw_Middle_Plate()
Draw_Top_Plate()
Save_to_STL()