bl
Control a live Blender scene by running ordered operation lists that build, edit, check, animate, and render 3D objects as one undo step.
Instructions
Control the live Blender. ops = list of {"op":..., ...}; runs in order as ONE undo step, stops at first error.
Refs: obj = name | [names] | "sel" | "active". Angles deg. Colors "#rrggbb" or [r,g,b].
scene{filter,type} info{obj} get{path} prop{path,value} (path e.g. "scene.render.fps", "Cube.data.energy", "objects.Cube.location")
add{type:cube|sphere|ico|cylinder|cone|plane|circle|torus|monkey|grid|empty|text|curve|camera|point|sun|spot|area, name,loc,rot,scale,dims,size,mat,smooth,body,energy,color,args{}}
set{obj,loc,rot,scale,dims,name,hide,parent,smooth,props{dotted.attr:val}} move{obj,by,rot,scale}
del{obj} dup{obj,n,by,linked,name,tree} select{obj|"all"|"none",active,add} join{obj} (add/dup/cam take col:"Name")
col{name,obj,parent,hide,exclude,color} rename{obj,seq:"Leg_{n}",sort:x|y|z|name,prefix,suffix,find,replace}
curve{name,pts[[x,y,z]..],type:poly|smooth,cyclic,bevel,fill,lathe[[r,z]..],steps,mesh,mat} (pipes, cables, vases, turned legs)
fit{obj,height|longest|dims,at,floor,apply,faces} (normalize imports; import{path,fit:true|{height}})
mat{obj,name,color,metal,rough,alpha,transmission,ior,emit,emit_strength,coat,spec,slot}
tex{obj|mat,kind:wood|fabric|marble|noise|brick|checker|tiles|leather|concrete,color1,color2,scale,bump,rough[min,max]} (procedural texture)
img{obj|mat,path|dir|maps{albedo,rough,normal,metal,disp,ao},size_m,proj:box|uv} (photo PBR set at real scale, no UVs needed)
asset{search,type:textures|hdris|models} -> ids; asset{id,res,obj|mat,size_m | rot,strength | at,height} (free CC0 Poly Haven; downloads)
mod{obj,type:bevel|subsurf|array|mirror|solidify|bool|decimate|weld|wireframe|screw|displace|remesh|nodes|...,name,props{},inputs{GN input:val},apply}
nodes{mat|obj|world|gn|comp, add{id:type|alias}, set{"id.Socket":v,"id.prop":v,"ramp.0":"#hex"}, link["a.Out>b.In"], del[ids], show, preset:"scatter"+instance,density,scale} (ids: bsdf,out,bg,in,rl)
apply{obj,mod:name|"all",xform:loc|rot|scale|all}
edit{obj,sel:all|keep|+z|-y..|{normal,tol}|{mat}|{above}|[ids],do:[{extrude:d|[x,y,z]},{inset:w|{w,depth}},{bevel:{w,seg}},{cut:{axis,n}},{bisect},{delete},{move},{scale},{subdivide},{mat},{smooth}]} (steps chain on new faces)
room{pts[[x,y]..],h,t,openings[{wall:i,at,w,h,sill(0=door)}],name,floor,ceiling,walls[i..],wall_mat,floor_mat} (walls+doors+windows+glass; walls:[0,1]=open corner)
place{obj,on:"floor"|name,at:[x,y]|"center",against,side:+x|-x|+y|-y,gap} (exact contact by real bounds)
check{obj,only:[floating,overlap,frame,scale,images,light,cam]|["game"],budget} (measured problems + fix hints; run before the final look)
gameprep{obj,engine:unity|unreal|godot,uv,apply,lods,collision,names} export{path,preset:unity|unreal|godot,obj,per:"object"}
aim{obj,at} cam{name,loc,at,lens,active}
key{obj,f,loc,rot,scale,props{},interp:linear|bezier|constant|bounce|...,ease:in|out|in_out}
anim{start,end,fps,preset:turntable|spin|pop_in|bounce|float,obj,turns,stagger,height}
con{obj,type:track|damped_track|follow_path|copy_loc|copy_rot|child_of|limit_dist|floor|...,target,name,props{},animate}
view{preset:front|back|left|right|top|bottom|camera|persp|ortho, orbit[yaw,pitch], zoom, dist, at, frame:"sel"|"all"|name, shading:solid|material|rendered|wireframe}
bop{id:"mesh.subdivide",args{},obj,edit,ctx:"view3d"} (any bpy.ops operator)
api{id|path|node|search} (look up operator args, writable props, node sockets in this Blender; use before guessing)
world{color,strength | hdri:studio|interior|forest|city|courtyard|night|sunrise|sunset|path,rot | sky:true,sun_elev,sun_rot,sun | bg}
render{path,res[w,h],pct,samples,engine,preview,look,max} (look:true returns the image; settings restored) import{path} export{path} save{path} open{path} new{keep} undo{n} redo{n}
py{code} (last resort; set out to return)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes |