Hello
Est ce quelqu'un saurait si il y a un moyen de trouver les dépendances d'un objet.
Par exemple si un objet a servi a créer des instances, trouver toutes les instances appelant cet objet.
Salut,
Je ne sais pas si la fonction existe, mais en python c'est assez facile avec une fonction récursive. Le script ci-dessous sélectionne toutes les instances qui ont comme source l'objet sélectionné.
Code PHP:
#coding : utf-8
import c4d
def sel_inst_from_source(source,obj=doc.GetFirstObject()):
"""fonction récursive pour sélectionner toutes les instances
de l'objet source"""
while obj:
if obj.CheckType(c4d.Oinstance):
if obj[c4d.INSTANCEOBJECT_LINK] == source:
#sélection de l'instance
obj.SetBit(c4d.BIT_ACTIVE)
#récursion
sel_inst_from_source(source,obj.GetDown())
obj = obj.GetNext()
def main():
if not op:
c4d.gui.MessageDialog("""Vous devez sélectionner un seul objet source des instances""")
return
#on déselectionne l'objet actif
op.DelBit(c4d.BIT_ACTIVE)
#sélection de toutes les instances de l'objet
sel_inst_from_source(op)
c4d.EventAdd()
if __name__=='__main__':
main()
Salut!
sinon tu peux essayer le plugin Instance renamer
https://www.rendertaxi.de/blog/en/c4...tance-renamer/
il te donne le nombre d'instances dépendantes et les renomme aussi ,
bien pratique
::::::::::::::
pxlntwrk.net
tu peux peut être prendre le problème à l'envers et savoir à partir d'une instance quel objet est son référent et donc par déduction ...
ça C4D le fait très bien mais tu dois déjà savoir faire ..
bon après relecture de ton message pas sur que ça fasse l'affaire mon truc ..
Dernière modification par Philippe casu ; 26/07/2018 à 15h49.
Deux hommes intelligents, d'idées opposées, trouvent beaucoup plus de choses à se dire que deux cons appartenant à un même parti.
@oli_d
Grand merci ton script marche nickel !
@pxl
Alors le plug-in est bien free, mais j'ais pas pu le telecharger. Ca te renvoie sur leur cloud ou il faut un compte et j'ai beau avoir cherché je n'ai pas trouver ou en creer un !
Dommage pouvoir les renommer en plus de les trouver c'etait pas mal.
Mais merci quand même
@Philippe
Oui je suis pas trop sur non plus, mais merci quand même
Tu peux toujours renommer avec l'outil nom, mais j'ai adapté le script pour qu'il ait le même comportement que le plugin proposé par pxlntwrk.
Tu peux sélectionner plusieurs objets sources et les instances sont automatiquement renommées selon l'objet source et numérotées.
J'ai rajouté un undo aussi pour pouvoir annuler
Code PHP:
#coding : utf-8
import c4d
def rename_inst_from_source(source,no=0,obj=doc.GetFirstObject()):
"""fonction récursive pour renommer toutes les instances
de l'objet source"""
while obj:
if obj.CheckType(c4d.Oinstance):
if obj[c4d.INSTANCEOBJECT_LINK] == source:
no+=1
doc.AddUndo(c4d.UNDOTYPE_CHANGE,obj)
obj.SetName("{0}_instance_{1}".format(source.GetName(),str(no)))
#récursion
no = rename_inst_from_source(source,no,obj.GetDown())
obj = obj.GetNext()
return no
def main():
msg = ''
doc.StartUndo()
for o in doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0):
nb = rename_inst_from_source(o)
msg += "{0} : {1} instances trouvées et renommées\n".format(o.GetName(),nb)
doc.EndUndo()
c4d.gui.MessageDialog(msg)
c4d.EventAdd()
if __name__=='__main__':
main()
Dernière modification par oli_d ; 27/07/2018 à 09h29.
ça marche super bien et quelle bonne idée de pouvoir renommer !
merci
Oser rêver, et mentir
Excellent !
Merci beaucoup Oli_d
merci Oli_D de cet exemple concret, je me met aussi au python et au python sous C4D, c'est très interessant !
J'ai réussi à modifier ton code pour qu'il affiche le pluriel ou le singulier dans le message final si il n'y a qu'une seule instance d'un objet. évidemment ça n'est pas très utile sinon à ce que je comprenne le code.
Code PHP:
#coding : utf-8
import c4d
def rename_inst_from_source(source,no=0,plu='',obj=doc.GetFirstObject()):
"""fonction récursive pour renommer toutes les instances de l'objet source"""
while obj:
if obj.CheckType(c4d.Oinstance):
if obj[c4d.INSTANCEOBJECT_LINK] == source:
no+=1
doc.AddUndo(c4d.UNDOTYPE_CHANGE,obj)
obj.SetName("{0}_instance_{1}".format(source.GetName(),str(no)))
#récursion
no = rename_inst_from_source(source,no,plu,obj.GetDown())
obj = obj.GetNext()
return no
def main():
msg = ''
doc.StartUndo()
for o in doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_0):
plu = ''
nb = rename_inst_from_source(o)
if nb > 1 : plu = "s"
msg += "{0} : {1} instance{2} trouvée{2} et renommée{2}\n".format(o.GetName(),nb,plu)
doc.EndUndo()
c4d.gui.MessageDialog(msg)
c4d.EventAdd()
if __name__=='__main__':
main()