coords = d[str(frame)]
except KeyError:
raise NoFrameCached(("frame %d not cached on" +
"object %s") %(frame,ob.name))
for v,c in zip(ob.getData(mesh=True).verts,coords):
v.co = Blender.Mathutils.Vector(c)
Чтобы завершить наш набор функций кеша, мы определяем функцию
def clearcache(ob):
try:
Blender.Registry.RemoveKey(ckey(ob))
except:
pass
Наш скрипт будет использоваться не только как скриптсвязь, связанная с объектом, но он также будет использоваться автономно (по нажатию
Второй скриншот показывает всплывающее меню с предложением выбрать объект из списка
Мы сначала определяем вспомогательную функцию, которая будет использована выпадающим меню, обеспечивающим пользователя выбором
def getmeshobjects(scene):
return [ob.name for ob in scene.objects if
ob.type=='Mesh']
Само меню осуществляется функцией
def targetmenu(ob):
meshobjects=getmeshobjects(Blender.Scene.GetCurrent())
menu='Select target%t|'+ "|".join(meshobjects)
ret = Blender.Draw.PupMenu(menu)
if ret>0:
try:
p = ob.getProperty(impresstarget)
p.setData(meshobjects[ret-1])
except:
ob.addProperty(impresstarget,meshobjects[ret-1])
Она выбирает список из всех Меш-объектов в сцене и представляет этот список на выбор пользователю, используя функцию Блендера
Основной интерфейс пользователя определяется на верхнем уровне скрипта. Он проверяет, что не был запущен как скриптсвязь, затем предоставляет пользователю несколько действий на выбор:
if not Blender.bylink:
ret = Blender.Draw.PupMenu('Impress scriptlink%t|'+
'Add/Replace scriptlink|'+
'Clear cache|Remove ' +
'all|New Target')
active = Blender.Scene.GetCurrent().objects.active
if ret > 0:
clearcache(active)
if ret== 1:
active.clearScriptLinks([scriptname])
active.addScriptLink(scriptname,'FrameChanged')
targetmenu(active)
elif ret== 2:
pass
elif ret== 3:
active.removeProperty(meshcache)
active.clearScriptLinks([scriptname])
elif ret== 4:
targetmenu(active)