Un petit problème qui m'a valu une bonne prise de tête :
J’ai longtemps cru que les dialogues asynchrones, c’est à dire un dialogue que l’on peut « docker » et qui reste actif sans bloquer les autres fonctionnalités, étaient réservés aux plugins dans Cinema4D. Puis un jour je tombe sur un bout de code qui fonctionnait, même avec un script. J'ai pensé que c'était une amélioration de la r17. Je développe un super dialogue, je copie je colle dans un autre script et paf, cela ne marchait plus. J'ai mis un bon moment à trouver pourquoi et je vous livre mes conclusions.
Un exemple simple :
Code PHP:
import c4d
class MonDlg( c4d.gui.GeDialog):
def CreateLayout(self):
self.AddStaticText(1000, c4d.BFH_SCALE|c4d.BFV_SCALE, initw=100, inith=20,name = 'Hello world !')
return True
def main():
dlg = MonDlg()
dlg.Open(c4d.DLG_TYPE_ASYNC)
if __name__=='__main__':
main()
Si on lance le script et que l'on essaie de modifier la taille de la fenêtre, le contenu disparaît
En fait c'est une bête histoire de portée de variables, la variable dlg est effacée à la fin du code. Par contre si je déclare dlg en global tout fonctionne:
Code PHP:
import c4d
class MonDlg( c4d.gui.GeDialog):
def CreateLayout(self):
self.AddStaticText(1000, c4d.BFH_SCALE|c4d.BFV_SCALE, initw=100, inith=20,name = 'Hello world !')
return True
def main():
global dlg
dlg = MonDlg()
dlg.Open(c4d.DLG_TYPE_ASYNC)
if __name__=='__main__':
main()
Sinon plus simplement, si on crée notre dialogue dans if __name__=='__main__': sans passer par une fonction, tout va bien !
Code PHP:
import c4d
class MonDlg( c4d.gui.GeDialog):
def CreateLayout(self):
self.AddStaticText(1000, c4d.BFH_SCALE|c4d.BFV_SCALE, initw=100, inith=20,name = 'Hello world !')
return True
if __name__=='__main__':
dlg = MonDlg()
dlg.Open(c4d.DLG_TYPE_ASYNC)