Skip to content
Snippets Groups Projects
Commit d8402cf4 authored by lijenstina's avatar lijenstina
Browse files

io_import_lipSync_Importer: adress the Prop error on reload

Bumped version to 0.5.2
Part of the T51547:
Move the registration of scene properties outside the Panel
as storing them there would make all sorts of nice things
after a reload
UI properties are moved to an already existing regMenuTypes
PropertyGroup

Pep8 cleanup
Replace bpy.props star import with a tuple one
The refactor is only related to address the register/reload
as the logic of the import is left untouched
Should be no functional changes on the user's side
nor other bugs / issues are fixed
parent 1f6326cc
No related branches found
Tags
No related merge requests found
...@@ -18,44 +18,51 @@ ...@@ -18,44 +18,51 @@
bl_info = { bl_info = {
"name": "LipSync Importer & Blinker", "name": "LipSync Importer & Blinker",
"author": "Yousef Harfoush - bat3a ;)", "author": "Yousef Harfoush - bat3a)",
"version": (0, 5, 1), "version": (0, 5, 2),
"blender": (2, 70, 0), "blender": (2, 70, 0),
"location": "3D window > Tool Shelf", "location": "3D window > Tool Shelf",
"description": "Plots Moho (Papagayo, Jlipsync, Yolo) file " "description": "Plots Moho (Papagayo, Jlipsync, Yolo) file "
"to frames and adds automatic blinking", "to frames and adds automatic blinking",
"warning": "", "warning": "",
"wiki_url": "http://wiki.blender.org/index.php?title=Extensions:2.6/Py/" "wiki_url": "https://wiki.blender.org/index.php?title=Extensions:2.6/Py/"
"Scripts/Import-Export/Lipsync Importer", "Scripts/Import-Export/Lipsync Importer",
"tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/", "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
"category": "Import-Export"} "category": "Import-Export"}
import bpy, re import bpy
import re
from random import random from random import random
from bpy.props import * from bpy.props import (
from bpy.props import IntProperty, FloatProperty, StringProperty EnumProperty,
IntProperty,
FloatProperty,
StringProperty,
PointerProperty,
)
global lastPhoneme global lastPhoneme
lastPhoneme = "nothing" lastPhoneme = "nothing"
# add blinking # add blinking
def blinker(): def blinker():
scn = bpy.context.scene scn = bpy.context.scene
obj = bpy.context.object
if scn.regMenuTypes.enumBlinkTypes == '0': if scn.regMenuTypes.enumBlinkTypes == '0':
modifier = 0 modifier = 0
elif scn.regMenuTypes.enumBlinkTypes == '1': elif scn.regMenuTypes.enumBlinkTypes == '1':
modifier = scn.blinkMod modifier = scn.regMenuTypes.blinkMod
# creating keys with blinkNm count # creating keys with blinkNm count
for y in range(scn.blinkNm): for y in range(scn.regMenuTypes.blinkNm):
frame = y * scn.blinkSp + int(random()*modifier) frame = y * scn.regMenuTypes.blinkSp + int(random() * modifier)
createShapekey('blink', frame) createShapekey('blink', frame)
# -----------code contributed by dalai felinto adds armature support modified by me-------------------
# -- code contributed by dalai felinto adds armature support modified by me --
bone_keys = { bone_keys = {
"AI": ('location', 0), "AI": ('location', 0),
...@@ -70,15 +77,15 @@ bone_keys = { ...@@ -70,15 +77,15 @@ bone_keys = {
"rest": ('ik_stretch', -1) "rest": ('ik_stretch', -1)
} }
def lipsyncerBone(): def lipsyncerBone():
# reading imported file & creating keys # reading imported file & creating keys
object = bpy.context.object
scene = bpy.context.scene scene = bpy.context.scene
bone = bpy.context.active_pose_bone bone = bpy.context.active_pose_bone
resetBoneScale(bone) resetBoneScale(bone)
f=open(scene.fpath) # importing file f = open(scene.regMenuTypes.fpath) # importing file
f.readline() # reading the 1st line that we don"t need f.readline() # reading the 1st line that we don"t need
for line in f: for line in f:
...@@ -93,6 +100,7 @@ def lipsyncerBone(): ...@@ -93,6 +100,7 @@ def lipsyncerBone():
if lst[1] == key: if lst[1] == key:
createBoneKeys(key, bone, attribute, frame) createBoneKeys(key, bone, attribute, frame)
def resetBoneScale(bone): def resetBoneScale(bone):
# set the attributes used by papagayo to 0.0 # set the attributes used by papagayo to 0.0
for attribute, index in bone_keys.values(): for attribute, index in bone_keys.values():
...@@ -102,12 +110,13 @@ def resetBoneScale(bone): ...@@ -102,12 +110,13 @@ def resetBoneScale(bone):
else: else:
exec("bone.%s = %f" % (attribute, 0.0)) exec("bone.%s = %f" % (attribute, 0.0))
def addBoneKey(bone, data_path, index=-1, value=None, frame=0, group=""): def addBoneKey(bone, data_path, index=-1, value=None, frame=0, group=""):
# set a value and keyframe for the bone # set a value and keyframe for the bone
# it assumes the 'bone' variable was defined before # it assumes the 'bone' variable was defined before
# and it's the current selected bone # and it's the current selected bone
frame = bpy.context.scene.frame_current frame = bpy.context.scene.frame_current
if value != None: if value is not None:
if index != -1: if index != -1:
# bone.location[0] = 0.0 # bone.location[0] = 0.0
exec("bone.%s[%d] = %f" % (data_path, index, value)) exec("bone.%s[%d] = %f" % (data_path, index, value))
...@@ -117,21 +126,21 @@ def addBoneKey(bone, data_path, index=-1, value=None, frame=0, group=""): ...@@ -117,21 +126,21 @@ def addBoneKey(bone, data_path, index=-1, value=None, frame=0, group=""):
# bone.keyframe_insert("location", 0, 10.0, "Lipsync") # bone.keyframe_insert("location", 0, 10.0, "Lipsync")
exec('bone.keyframe_insert("%s", %d, %f, "%s")' % (data_path, index, frame, group)) exec('bone.keyframe_insert("%s", %d, %f, "%s")' % (data_path, index, frame, group))
# creating keys with offset and eases for a phonem @ the Skframe # creating keys with offset and eases for a phonem @ the Skframe
def createBoneKeys(phoneme, bone, attribute, frame): def createBoneKeys(phoneme, bone, attribute, frame):
global lastPhoneme global lastPhoneme
scene = bpy.context.scene scene = bpy.context.scene
object = bpy.context.object
offst = scene.offset # offset value offst = scene.regMenuTypes.offset # offset value
skVlu = scene.skscale # shape key value skVlu = scene.regMenuTypes.skscale # shape key value
# in case of Papagayo format # in case of Papagayo format
if scene.regMenuTypes.enumFileTypes == '0': if scene.regMenuTypes.enumFileTypes == '0':
frmIn = scene.easeIn # ease in value frmIn = scene.regMenuTypes.easeIn # ease in value
frmOut = scene.easeOut # ease out value frmOut = scene.regMenuTypes.easeOut # ease out value
hldIn = scene.holdGap # holding time value hldIn = scene.regMenuTypes.holdGap # holding time value
# in case of Jlipsync format or Yolo # in case of Jlipsync format or Yolo
elif scene.regMenuTypes.enumFileTypes == '1': elif scene.regMenuTypes.enumFileTypes == '1':
...@@ -149,6 +158,7 @@ def createBoneKeys(phoneme, bone, attribute, frame): ...@@ -149,6 +158,7 @@ def createBoneKeys(phoneme, bone, attribute, frame):
lastPhoneme = phoneme lastPhoneme = phoneme
# ------------------------------------------------------------------------------- # -------------------------------------------------------------------------------
# reading imported file & creating keys # reading imported file & creating keys
...@@ -157,7 +167,7 @@ def lipsyncer(): ...@@ -157,7 +167,7 @@ def lipsyncer():
obj = bpy.context.object obj = bpy.context.object
scn = bpy.context.scene scn = bpy.context.scene
f=open(scn.fpath) # importing file f = open(scn.regMenuTypes.fpath) # importing file
f.readline() # reading the 1st line that we don"t need f.readline() # reading the 1st line that we don"t need
for line in f: for line in f:
...@@ -173,6 +183,7 @@ def lipsyncer(): ...@@ -173,6 +183,7 @@ def lipsyncer():
if lst[1] == key.name: if lst[1] == key.name:
createShapekey(key.name, frame) createShapekey(key.name, frame)
# creating keys with offset and eases for a phonem @ the frame # creating keys with offset and eases for a phonem @ the frame
def createShapekey(phoneme, frame): def createShapekey(phoneme, frame):
...@@ -182,14 +193,14 @@ def createShapekey(phoneme, frame): ...@@ -182,14 +193,14 @@ def createShapekey(phoneme, frame):
obj = bpy.context.object obj = bpy.context.object
objSK = obj.data.shape_keys objSK = obj.data.shape_keys
offst = scn.offset # offset value offst = scn.regMenuTypes.offset # offset value
skVlu = scn.skscale # shape key value skVlu = scn.regMenuTypes.skscale # shape key value
# in case of Papagayo format # in case of Papagayo format
if scn.regMenuTypes.enumFileTypes == '0': if scn.regMenuTypes.enumFileTypes == '0':
frmIn = scn.easeIn # ease in value frmIn = scn.regMenuTypes.easeIn # ease in value
frmOut = scn.easeOut # ease out value frmOut = scn.regMenuTypes.easeOut # ease out value
hldIn = scn.holdGap # holding time value hldIn = scn.regMenuTypes.holdGap # holding time value
# in case of Jlipsync format or Yolo # in case of Jlipsync format or Yolo
elif scn.regMenuTypes.enumFileTypes == '1': elif scn.regMenuTypes.enumFileTypes == '1':
...@@ -200,23 +211,25 @@ def createShapekey(phoneme, frame): ...@@ -200,23 +211,25 @@ def createShapekey(phoneme, frame):
# inserting the In key only when phonem change or when blinking # inserting the In key only when phonem change or when blinking
if lastPhoneme != phoneme or eval(scn.regMenuTypes.enumModeTypes) == 1: if lastPhoneme != phoneme or eval(scn.regMenuTypes.enumModeTypes) == 1:
objSK.key_blocks[phoneme].value = 0.0 objSK.key_blocks[phoneme].value = 0.0
objSK.key_blocks[phoneme].keyframe_insert("value", objSK.key_blocks[phoneme].keyframe_insert(
-1, offst+frame-frmIn, "Lipsync") "value", -1, offst + frame - frmIn, "Lipsync"
)
objSK.key_blocks[phoneme].value = skVlu objSK.key_blocks[phoneme].value = skVlu
objSK.key_blocks[phoneme].keyframe_insert("value", objSK.key_blocks[phoneme].keyframe_insert(
-1, offst+frame, "Lipsync") "value", -1, offst + frame, "Lipsync"
)
objSK.key_blocks[phoneme].value = skVlu objSK.key_blocks[phoneme].value = skVlu
objSK.key_blocks[phoneme].keyframe_insert("value", objSK.key_blocks[phoneme].keyframe_insert(
-1, offst+frame+hldIn, "Lipsync") "value", -1, offst + frame + hldIn, "Lipsync"
)
objSK.key_blocks[phoneme].value = 0.0 objSK.key_blocks[phoneme].value = 0.0
objSK.key_blocks[phoneme].keyframe_insert("value", objSK.key_blocks[phoneme].keyframe_insert(
-1, offst+frame+hldIn+frmOut, "Lipsync") "value", -1, offst + frame + hldIn + frmOut, "Lipsync"
)
lastPhoneme = phoneme lastPhoneme = phoneme
# lipsyncer operation start # lipsyncer operation start
class btn_lipsyncer(bpy.types.Operator): class btn_lipsyncer(bpy.types.Operator):
bl_idname = 'lipsync.go' bl_idname = 'lipsync.go'
...@@ -229,23 +242,32 @@ class btn_lipsyncer(bpy.types.Operator): ...@@ -229,23 +242,32 @@ class btn_lipsyncer(bpy.types.Operator):
obj = context.active_object obj = context.active_object
# testing if object is valid # testing if object is valid
if obj!=None: if obj is not None:
if obj.type == "MESH": if obj.type == "MESH":
if obj.data.shape_keys!=None: if obj.data.shape_keys is not None:
if scn.fpath!='': lipsyncer() if scn.regMenuTypes.fpath != '':
else: print ("select a Moho file") lipsyncer()
else: print("No shape keys") else:
print("select a Moho file")
else:
print("No shape keys")
elif obj.type == "ARMATURE": elif obj.type == "ARMATURE":
if 1: # XXX add prop test if 1: # XXX add prop test
if scn.fpath!='': lipsyncerBone() if scn.regMenuTypes.fpath != '':
else: print ("select a Moho file") lipsyncerBone()
else: print("Create Pose properties") else:
print("select a Moho file")
else:
print("Create Pose properties")
else:
print("Object is not a mesh ot bone")
else:
print("Select object")
else: print ("Object is not a mesh ot bone")
else: print ("Select object")
return {'FINISHED'} return {'FINISHED'}
# blinker operation start # blinker operation start
class btn_blinker(bpy.types.Operator): class btn_blinker(bpy.types.Operator):
bl_idname = 'blink.go' bl_idname = 'blink.go'
...@@ -254,42 +276,94 @@ class btn_blinker(bpy.types.Operator): ...@@ -254,42 +276,94 @@ class btn_blinker(bpy.types.Operator):
def execute(self, context): def execute(self, context):
scn = context.scene
obj = context.object obj = context.object
# testing if object is valid # testing if object is valid
if obj!=None: if obj is not None:
if obj.type == "MESH": if obj.type == "MESH":
if obj.data.shape_keys!=None: if obj.data.shape_keys is not None:
for key in obj.data.shape_keys.key_blocks: for key in obj.data.shape_keys.key_blocks:
if key.name == 'blink': if key.name == 'blink':
blinker() blinker()
# return # return
else: print("No shape keys") else:
else: print ("Object is not a mesh ot bone") print("No shape keys")
else: print ("Select object") else:
print("Object is not a mesh ot bone")
else:
print("Select object")
return {'FINISHED'} return {'FINISHED'}
# defining custom enumeratos # defining custom enumeratos
class menuTypes(bpy.types.PropertyGroup): class menuTypes(bpy.types.PropertyGroup):
enumFileTypes = EnumProperty(items =(('0', 'Papagayo', ''), enumFileTypes = EnumProperty(
items=(('0', 'Papagayo', ''),
('1', 'Jlipsync Or Yolo', '') ('1', 'Jlipsync Or Yolo', '')
#,('2', 'Retarget', '') # ('2', 'Retarget', '')
), ),
name='Choose FileType', name='Choose FileType',
default = '0') default='0'
)
enumBlinkTypes = EnumProperty(items =(('0', 'Specific', ''), enumBlinkTypes = EnumProperty(
items=(('0', 'Specific', ''),
('1', 'Random', '')), ('1', 'Random', '')),
name='Choose BlinkType', name='Choose BlinkType',
default = '0') default='0'
)
enumModeTypes = EnumProperty(items =(('0', 'Lipsyncer',''), enumModeTypes = EnumProperty(
items=(('0', 'Lipsyncer', ''),
('1', 'Blinker', '')), ('1', 'Blinker', '')),
name='Choose Mode', name='Choose Mode',
default = '0') default='0'
)
fpath = StringProperty(
name="Import File ",
description="Select your voice file",
subtype="FILE_PATH"
)
skscale = FloatProperty(
description="Smoothing shape key values",
min=0.1, max=1.0,
default=0.8
)
offset = IntProperty(
description="Offset your frames",
default=0
)
easeIn = IntProperty(
description="Smoothing In curve",
min=1, default=3
)
easeOut = IntProperty(
description="Smoothing Out curve",
min=1,
default=3
)
holdGap = IntProperty(
description="Holding for slow keys",
min=0,
default=0
)
blinkSp = IntProperty(
description="Space between blinks",
min=1,
default=100
)
blinkNm = IntProperty(
description="Number of blinks",
min=1,
default=10
)
blinkMod = IntProperty(
description="Randomzing keyframe placment",
min=1,
default=10
)
# drawing the user interface # drawing the user interface
class LipSyncBoneUI(bpy.types.Panel): class LipSyncBoneUI(bpy.types.Panel):
...@@ -309,6 +383,7 @@ class LipSyncBoneUI(bpy.types.Panel): ...@@ -309,6 +383,7 @@ class LipSyncBoneUI(bpy.types.Panel):
col.prop(bone, "location", index=0, text="AI") col.prop(bone, "location", index=0, text="AI")
col.prop(bone, "location", index=1, text="E") col.prop(bone, "location", index=1, text="E")
col.prop(bone, "location", index=2, text="FV") col.prop(bone, "location", index=2, text="FV")
if bpy.context.scene.unit_settings.system_rotation == 'RADIANS': if bpy.context.scene.unit_settings.system_rotation == 'RADIANS':
col.prop(bone, "rotation_euler", index=0, text="L") col.prop(bone, "rotation_euler", index=0, text="L")
col.prop(bone, "rotation_euler", index=1, text="MBP") col.prop(bone, "rotation_euler", index=1, text="MBP")
...@@ -317,41 +392,29 @@ class LipSyncBoneUI(bpy.types.Panel): ...@@ -317,41 +392,29 @@ class LipSyncBoneUI(bpy.types.Panel):
row = col.row() row = col.row()
row.prop(bone, "rotation_euler", index=0, text="L") row.prop(bone, "rotation_euler", index=0, text="L")
row.label(text=str("%4.2f" % (bone.rotation_euler.x))) row.label(text=str("%4.2f" % (bone.rotation_euler.x)))
row = col.row() row = col.row()
row.prop(bone, "rotation_euler", index=1, text="MBP") row.prop(bone, "rotation_euler", index=1, text="MBP")
row.label(text=str("%4.2f" % (bone.rotation_euler.y))) row.label(text=str("%4.2f" % (bone.rotation_euler.y)))
row = col.row() row = col.row()
row.prop(bone, "rotation_euler", index=2, text="O") row.prop(bone, "rotation_euler", index=2, text="O")
row.label(text=str("%4.2f" % (bone.rotation_euler.z))) row.label(text=str("%4.2f" % (bone.rotation_euler.z)))
col.prop(bone, "scale", index=0, text="U") col.prop(bone, "scale", index=0, text="U")
col.prop(bone, "scale", index=1, text="WQ") col.prop(bone, "scale", index=1, text="WQ")
col.prop(bone, "scale", index=2, text="etc") col.prop(bone, "scale", index=2, text="etc")
else: else:
layout.label(text="No good bone is selected") layout.label(text="No good bone is selected")
# drawing the user interface # drawing the user interface
class LipSyncUI(bpy.types.Panel): class LipSyncUI(bpy.types.Panel):
bl_space_type = "VIEW_3D" bl_space_type = "VIEW_3D"
bl_region_type = "TOOL_PROPS" bl_region_type = "TOOL_PROPS"
bl_label = "LipSync Importer & Blinker" bl_label = "LipSync Importer & Blinker"
newType= bpy.types.Scene
newType.fpath = StringProperty(name="Import File ", description="Select your voice file", subtype="FILE_PATH")
newType.skscale = FloatProperty(description="Smoothing shape key values", min=0.1, max=1.0, default=0.8)
newType.offset = IntProperty(description="Offset your frames", default=0)
newType.easeIn = IntProperty(description="Smoothing In curve", min=1, default=3)
newType.easeOut = IntProperty(description="Smoothing Out curve", min=1, default=3)
newType.holdGap = IntProperty(description="Holding for slow keys", min=0, default=0)
newType.blinkSp = IntProperty(description="Space between blinks", min=1, default=100)
newType.blinkNm = IntProperty(description="Number of blinks", min=1, default=10)
newType.blinkMod = IntProperty(description="Randomzing keyframe placment", min=1, default=10)
def draw(self, context): def draw(self, context):
obj = bpy.context.active_object obj = bpy.context.active_object
scn = bpy.context.scene scn = bpy.context.scene
...@@ -359,11 +422,12 @@ class LipSyncUI(bpy.types.Panel): ...@@ -359,11 +422,12 @@ class LipSyncUI(bpy.types.Panel):
col = layout.column() col = layout.column()
# showing the current object type # showing the current object type
if obj != None: if obj is not None:
if obj.type == "MESH": if obj.type == "MESH":
split = col.split(align=True) split = col.split(align=True)
split.label(text="The active object is: ", icon="OBJECT_DATA") split.label(text="The active object is: ", icon="OBJECT_DATA")
split.label(obj.name, icon="EDITMODE_HLT") split.label(obj.name, icon="EDITMODE_HLT")
elif obj.type == "ARMATURE": # bone needs to be selected elif obj.type == "ARMATURE": # bone needs to be selected
if obj.mode == "POSE": # mode needs to be pose if obj.mode == "POSE": # mode needs to be pose
split = col.split(align=True) split = col.split(align=True)
...@@ -386,29 +450,33 @@ class LipSyncUI(bpy.types.Panel): ...@@ -386,29 +450,33 @@ class LipSyncUI(bpy.types.Panel):
# Papagayo panel # Papagayo panel
if scn.regMenuTypes.enumFileTypes == '0': if scn.regMenuTypes.enumFileTypes == '0':
col.prop(context.scene, "fpath") col.prop(scn.regMenuTypes, "fpath")
split = col.split(align=True) split = col.split(align=True)
split.label("Key Value :") split.label("Key Value :")
split.prop(context.scene, "skscale") split.prop(scn.regMenuTypes, "skscale")
split = col.split(align=True) split = col.split(align=True)
split.label("Frame Offset :") split.label("Frame Offset :")
split.prop(context.scene, "offset") split.prop(scn.regMenuTypes, "offset")
split = col.split(align=True) split = col.split(align=True)
split.prop(context.scene, "easeIn", "Ease In") split.prop(scn.regMenuTypes, "easeIn", "Ease In")
split.prop(context.scene, "holdGap", "Hold Gap") split.prop(scn.regMenuTypes, "holdGap", "Hold Gap")
split.prop(context.scene, "easeOut", "Ease Out") split.prop(scn.regMenuTypes, "easeOut", "Ease Out")
col.operator('lipsync.go', text='Plot Keys to the Timeline') col.operator('lipsync.go', text='Plot Keys to the Timeline')
# Jlipsync & Yolo panel # Jlipsync & Yolo panel
elif scn.regMenuTypes.enumFileTypes == '1': elif scn.regMenuTypes.enumFileTypes == '1':
col.prop(context.scene, "fpath") col.prop(scn.regMenuTypes, "fpath")
split = col.split(align=True) split = col.split(align=True)
split.label("Key Value :") split.label("Key Value :")
split.prop(context.scene, "skscale") split.prop(scn.regMenuTypes, "skscale")
split = col.split(align=True) split = col.split(align=True)
split.label("Frame Offset :") split.label("Frame Offset :")
split.prop(context.scene, "offset") split.prop(scn.regMenuTypes, "offset")
col.operator('lipsync.go', text='Plot Keys to the Timeline') col.operator('lipsync.go', text='Plot Keys to the Timeline')
...@@ -421,61 +489,52 @@ class LipSyncUI(bpy.types.Panel): ...@@ -421,61 +489,52 @@ class LipSyncUI(bpy.types.Panel):
if scn.regMenuTypes.enumBlinkTypes == '0': if scn.regMenuTypes.enumBlinkTypes == '0':
split = col.split(align=True) split = col.split(align=True)
split.label("Key Value :") split.label("Key Value :")
split.prop(context.scene, "skscale") split.prop(scn.regMenuTypes, "skscale")
split = col.split(align=True) split = col.split(align=True)
split.label("Frame Offset :") split.label("Frame Offset :")
split.prop(context.scene, "offset") split.prop(scn.regMenuTypes, "offset")
split = col.split(align=True) split = col.split(align=True)
split.prop(context.scene, "easeIn", "Ease In") split.prop(scn.regMenuTypes, "easeIn", "Ease In")
split.prop(context.scene, "holdGap", "Hold Gap") split.prop(scn.regMenuTypes, "holdGap", "Hold Gap")
split.prop(context.scene, "easeOut", "Ease Out") split.prop(scn.regMenuTypes, "easeOut", "Ease Out")
col.prop(context.scene, "blinkSp", "Spacing") col.prop(scn.regMenuTypes, "blinkSp", "Spacing")
col.prop(context.scene, "blinkNm", "Times") col.prop(scn.regMenuTypes, "blinkNm", "Times")
col.operator('blink.go', text='Add Keys to the Timeline') col.operator('blink.go', text='Add Keys to the Timeline')
# Random panel # Random panel
elif scn.regMenuTypes.enumBlinkTypes == '1': elif scn.regMenuTypes.enumBlinkTypes == '1':
split = col.split(align=True) split = col.split(align=True)
split.label("Key Value :") split.label("Key Value :")
split.prop(context.scene, "skscale") split.prop(scn.regMenuTypes, "skscale")
split = col.split(align=True) split = col.split(align=True)
split.label("Frame Start :") split.label("Frame Start :")
split.prop(context.scene, "offset") split.prop(scn.regMenuTypes, "offset")
split = col.split(align=True) split = col.split(align=True)
split.prop(context.scene, "easeIn", "Ease In") split.prop(scn.regMenuTypes, "easeIn", "Ease In")
split.prop(context.scene, "holdGap", "Hold Gap") split.prop(scn.regMenuTypes, "holdGap", "Hold Gap")
split.prop(context.scene, "easeOut", "Ease Out") split.prop(scn.regMenuTypes, "easeOut", "Ease Out")
split = col.split(align=True) split = col.split(align=True)
split.prop(context.scene, "blinkSp", "Spacing") split.prop(scn.regMenuTypes, "blinkSp", "Spacing")
split.prop(context.scene, "blinkMod", "Random Modifier") split.prop(scn.regMenuTypes, "blinkMod", "Random Modifier")
col.prop(context.scene, "blinkNm", "Times") col.prop(scn.regMenuTypes, "blinkNm", "Times")
col.operator('blink.go', text='Add Keys to the Timeline') col.operator('blink.go', text='Add Keys to the Timeline')
# clearing vars
def clear_properties():
# can happen on reload
if bpy.context.scene is None:
return
props = ["fpath", "skscale", "offset", "easeIn", "easeOut", "holdGap", "blinkSp", "blinkNm", "blinkMod"]
for p in props:
if p in bpy.types.Scene.bl_rna.properties:
exec("del bpy.types.Scene."+p)
if p in bpy.context.scene:
del bpy.context.scene[p]
# registering the script # registering the script
def register(): def register():
bpy.utils.register_module(__name__) bpy.utils.register_module(__name__)
bpy.types.Scene.regMenuTypes = PointerProperty(type=menuTypes) bpy.types.Scene.regMenuTypes = PointerProperty(type=menuTypes)
def unregister(): def unregister():
bpy.utils.unregister_module(__name__) bpy.utils.unregister_module(__name__)
del bpy.types.Scene.regMenuTypes del bpy.types.Scene.regMenuTypes
clear_properties()
if __name__ == "__main__": if __name__ == "__main__":
register() register()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment