On 15/07/2014 at 10:35, xxxxxxxx wrote:
Hi,
Having problems with a script I'm writing. I've stripped it right down to the relevant bits. Basically what I'm doing is to do with swapping lots of different materials on objects and rendering various passes automatically. I'm storing the settings for the various passes in some nulls which can get saved with the scene (this is better for my particular job than using the render settings presets).
Anyway, the trouble with this script is that when you hit the button, it only reads the data from the null that was selected when the script was executed (check the console), and I want it to get the data from the currently selected null object whenever the button is pressed.
Also, if it is executed without anything selected, it fails.
It seems to read the data from the scene only when the script is run, and not when the button is pressed.
Any ideas?
Thanks to anyone who can help. I'm pretty new to python...
import c4d
import os
from c4d import gui
BUTTON1=1002
GROUP_ID1=1000
###################### READ USER DATA ####################################
def read_user_data() :
doc = c4d.documents.GetActiveDocument()
selectedPass = doc.GetActiveObject()
selUserData = selectedPass.GetUserDataContainer()
flags = {
'mul' : 0,
'RGB' : 0,
'spe' : 0,
'dif' : 0,
'ref' : 0
}
print "*"*10
print selUserData
for descId, container in selUserData:
index = descId[1].id
print index
print "*"*5
for key, val in container:
for txt, i in c4d.__dict__.iteritems() :
if key == i and txt == "DESC_SHORT_NAME":
if val == "Multi":
flags['mul'] = op[c4d.ID_USERDATA, index]
print txt,"=",val, ", flag = ", flags['mul']
elif val == "RGBA":
flags['RGB'] = op[c4d.ID_USERDATA, index]
print txt,"=",val, ", flag = ", flags['RGB']
elif val == "specular":
flags['spe'] = op[c4d.ID_USERDATA, index]
print txt,"=",val, ", flag = ", flags['spe']
elif val == "Diffuse":
flags['dif'] = op[c4d.ID_USERDATA, index]
print txt,"=",val, ", flag = ", flags['dif']
elif val == "Reflection":
flags['ref'] = op[c4d.ID_USERDATA, index]
print txt,"=",val, ", flag = ", flags['ref']
else:
pass
c4d.EventAdd()
return flags
############################## SETUP DIALOG #############################
class MaterialSwapDlg(gui.GeDialog) :
def CreateLayout(self) :
#create the layout
self.GroupBegin(GROUP_ID1, c4d.BFH_LEFT, 1, 1)
self.AddButton(BUTTON1, c4d.BFH_LEFT, name="test")
self.GroupEnd()
return True
def InitValues(self) :
return True
def Command(self, id, msg) :
#handle user input
if id==BUTTON1:
print "*"*10
user_flags = read_user_data()
print "user flags = ", user_flags
return True
##################################### MAIN ###############################
if __name__=='__main__':
dlg = MaterialSwapDlg()
dlg.Open(c4d.DLG_TYPE_ASYNC, defaultw=50, defaulth=50)