PDA

Voir la version complète : Python données utilsateur et groupe



oli_d
16/11/2013, 12h49
Bonjour les gens,

Est-ce que quelqu'un aurait le secret pour pouvoir mettre en enfant d'un groupe une donnée utilisateur (avec du python bien entendu).

Créer les groupes et les DU ça il n'y a aucun problème, mais créer la hiérarchie je sèche ...

valkaari
16/11/2013, 14h48
regardes ici (http://www.plugincafe.com/forum/forum_posts.asp?TID=8084)
le post de scoottA en bas.

Dans le basecontainer il semblerait qu'il faut renseigner l'ID c4d.DESC_PARENTGROUP

oli_d
16/11/2013, 17h41
Merci valkaari tu es un dieu, ça marche impeccable !

valkaari
17/11/2013, 02h42
J'ai un peu regardé, la fonction AddUserData() renvoie le DescID.

Il suffit de mettre ce descID dans le champ DESC_PARENTGROUP de la donnée qu'on souhaite ajouter.

en reprenant le code de scottA (qui fonctionne hein) ça devient limpide. ..... ou pas



import c4d
def main():

obj = doc.GetActiveObject()
pyTag = c4d.BaseTag(1022749) #Create a python tag to host the User Data

#The top most parent group
rootGroup = c4d.GetCustomDatatypeDefault(c4d.DTYPE_GROUP)
rootGroup[c4d.DESC_NAME] = "Root"
rootGroup[c4d.DESC_TITLEBAR] = False
rootGroup[c4d.DESC_LAYOUTGROUP] = True
rootGroup[c4d.DESC_COLUMNS] = 3
rootDescID = pyTag.AddUserData(rootGroup)

#A group that's a child of the root group
childGroup = c4d.GetCustomDatatypeDefault(c4d.DTYPE_GROUP)
childGroup[c4d.DESC_NAME] = "childGroup"
childGroup[c4d.DESC_TITLEBAR] = False
childGroup[c4d.DESC_PARENTGROUP] = rootDescID
childGroupDescID = pyTag.AddUserData(childGroup)


#A string type UD entry for this group
childGrp_Item1 = c4d.GetCustomDatatypeDefault(c4d.DTYPE_STRING)
childGrp_Item1[c4d.DESC_NAME] = "Item1"
childGrp_Item1[c4d.DESC_PARENTGROUP] = childGroupDescID
pyTag[pyTag.AddUserData(childGrp_Item1)] ="Hello World"


#A Real type UD entry for this group
childGrp_Item2 = c4d.GetCustomDatatypeDefault(c4d.DTYPE_REAL)
childGrp_Item2[c4d.DESC_NAME] = "Item2"
childGrp_Item2[c4d.DESC_PARENTGROUP] = childGroupDescID
pyTag[pyTag.AddUserData(childGrp_Item2)] = 55.6

obj.InsertTag(pyTag)
c4d.EventAdd()

if __name__=='__main__':
main()



et cadeau bonux, si on souhaite ajouter un group en dehors du group par défaut (donc faire un nouvel onglet) il faut quand même renseigner le parentgroup mais avec une donnée vide :


rootGroup[c4d.DESC_PARENTGROUP] = c4d.DescID()

oli_d
17/11/2013, 09h21
J'ai un peu regardé, la fonction AddUserData() renvoie le DescID.

Il suffit de mettre ce descID dans le champ DESC_PARENTGROUP de la donnée qu'on souhaite ajouter.

en reprenant le code de scottA (qui fonctionne hein) ça devient limpide. ..... ou pas
C'est effectivement plus simple, je l'avais déjà modifié



et cadeau bonux, si on souhaite ajouter un group en dehors du group par défaut (donc faire un nouvel onglet) il faut quand même renseigner le parentgroup mais avec une donnée vide :

rootGroup[c4d.DESC_PARENTGROUP] = c4d.DescID()
Je suis vraiment fan de tes cadeaux bonux, j'avais essayé de le faire et j'ai abandonné. J'ai essayé de mettre None, c4d.NOTOK, l'adresse de ma belle-mère mais rien ne marchait. Merci mille fois ! (for i in xrange(1000) : print 'Merci')

En fait le but de tout ça c'est un script pour créer des données utilisateurs depuis un fichier Excel :



import c4d
import xlrd,os

""" le fichier excel doit avoir 4 colonnes :
groupe1, groupe2, nom de la DU, type (selon dictionnaire ci-dessous)
pour groupe1 et groupe 2 remplir la case seulement lorsqu'il y a un changement de groupe
seul le premier classeur est pris en compte"""

#dictionnaire pour les types, a completer ...
TYPES = {'text':c4d.DTYPE_STRING,
'long':c4d.DTYPE_LONG,
'float':c4d.DTYPE_REAL,
'liste':c4d.DTYPE_LONG }

def addGrpe(obj,name,descid_parent = None):
bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP)
bc[c4d.DESC_PARENTGROUP] = descid_parent
bc[c4d.DESC_NAME] = str(name)
bc[c4d.DESC_TITLEBAR] = True
grpe = obj.AddUserData(bc)
return grpe

def addUD(obj,name,typ,descid_parent = None):
bc = c4d.GetCustomDataTypeDefault(typ)
bc[c4d.DESC_NAME] = str(name)
bc[c4d.DESC_PARENTGROUP] = descid_parent
ud = obj.AddUserData(bc)
return ud


def main():
fn = c4d.storage.LoadDialog()
if not fn : return
ext = os.path.splitext(fn)[1]
if ext != '.xls' and ext != '.xlsx':
c4d.gui.MessageDialog("{0} n'est pas un fichier Excel (.xls ou .xlsx)".format(os.path.basename(fn)))
return


wb = xlrd.open_workbook(fn)
sh = wb.sheet_by_index(0)
niv1_pred = None
niv2_pred = None

for rownum in range(sh.nrows):
niv1,niv2,ud,typ = sh.row_values(rownum)

if niv1 :
desc_niv1 = addGrpe(op,niv1,descid_parent = c4d.DescID())
id_niv1 = desc_niv1[1].id-1

if niv2 :
desc_niv2 = addGrpe(op,niv2,descid_parent = desc_niv1)
id_niv2 = desc_niv2[1].id-1

addUD(op,ud,TYPES[typ],descid_parent = desc_niv2)

niv1_pred = niv1
niv2_pred = niv2

c4d.EventAdd()


if __name__=='__main__':
main()



Il faut installer d'abord la bibliothèque xlrd qui provient de http://www.python-excel.org/. J'ai tout mis en pièce jointe avec exemple de fichier excel et marche à suivre pour l'installation.

Une fois installé, sélectionner l'objet sur lequel on veut les DU et lancer le script.

Le but c'est de pouvoir travailler sur des prototypes avec des DU, de tester et ensuite créer les plugs nécessaires. Là je tente de porter Arbaro (http://arbaro.sourceforge.net/) sur C4D.

César Vonc
17/11/2013, 11h32
Hmm, très intéressant, surtout Arbaro dans C4D ! ^^

Note que tu as le module xml implémenté dans Python pour lire les fichiers XML. Je l'ai pas mal expérimenté, si tu veux des exemples. Il me semble qu'Arbaro fonctionne avec ce format.

oli_d
17/11/2013, 12h34
J'étais tombé par hasard sur une bibliothèque en python pour générer des arbres sur PovRay depuis des fichiers xml (de Yohann Pitrey Helpiquet et Guillaume Nee, mais je n'arrive pas à retrouver la source sur internet, si il y a des intéressés je l'ai sous la main).

Je me suis basé la dessus, j'arrive à importer dans c4d la structure, j'ai juste encore quelques petits problèmes avec les feuilles. Ce que j'aimerais faire c'est déjà d'obtenir un truc un peu plus intuitif qu'arbaro et surtout ce qui me manque dans tous les générateurs d'arbres (xfrog, dpit, etc... ) c'est qu'une fois l'arbre généré c'est de pouvoir facilement modifier manuellement la structure de base en me basant par exemple sur des photos d'arbres. Je rêve de points de contrôle pour déplacer tel ou tel branche, la plier, la tourner, la tailler, etc ... Un peu à l'image TreeSketch (https://itunes.apple.com/us/app/treesketch/id421230117?mt=8), mais dans C4D

Cela risque d'âtre un peu long surtout que je n'ai pas trop de temps en ce moment ...