Code Edit for 2.8x, for 2.7x see previous revision.
Some Edits
- The collection
bpy.data.objects is all objects in a blend file,
whether linked to context scene, another scene or no scene. If not in
the context scene cannot be the context object. Use scene.objects
- I put the "convenience variable"
context in test scripts, so I can
paste later into panel or operator code where it is passed as a
parameter to most methods, in which case better not to use path addressing from bpy IMO it gets tedious reading bpy.context.object.data.uv_foo.bar.blah
- Add a UV map named "LightMap" if the mesh doesn't already have one.
- Blender uses radians not degrees as the native unit of rotation. This appears to be one of the anomalies.
- Remember to select faces to be unwrapped.
Script
import bpy
from math import radians
context = bpy.context
scene = context.scene
vl = context.view_layer
# deselect all to make sure select one at a time
bpy.ops.object.select_all(action='DESELECT')
for obj in scene.objects:
if (obj.type == 'MESH'):
vl.objects.active = obj
obj.select_set(True)
print(obj.name)
lm = obj.data.uv_layers.get("LightMap")
if not lm:
lm = obj.data.uv_layers.new(name="LightMap")
lm.active = True
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT') # for all faces
bpy.ops.uv.smart_project(angle_limit=66, island_margin = 0.02)
bpy.ops.object.editmode_toggle()
obj.select_set(False)
Resultant UVMap "LightMap" on Suzanne, using limit angle radians(66) interpreted as 1.152 degrees
Related
https://blender.stackexchange.com/a/172990/15543
bpy.ops.uv.lightmap_pack(), it seems to use more of the texture space by allocating rectangles for each face, would this be the better option to use nowadays? – Ray Jan 28 '21 at 20:34