Voir la version complète : Python données utilsateur et groupe
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, 13h48
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
Merci valkaari tu es un dieu, ça marche impeccable !
valkaari
17/11/2013, 01h42
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()
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, 10h32
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.
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 ...
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés