Bonjour,
Je cherche à créer un générateur qui ne bloque pas tout Cinema 4D pendant que le calcul de l'objet s'effectue, un peu comme le Booléen que l'on peut annuler avant qu'il termine son opération.
Actuellement, on est obligé d'attendre que la boucle se termine, C4D ne veut rien entendre pendant.Code PHP:
class Essai(plugins.ObjectData):
def __init__(self):
self.SetOptimizeCache(True)
def GetVirtualObjects(self, op, hierarchyhelp):
for i in xrange(5000000) :
c4d.StatusSetBar(i * 0.00002)
a = math.sqrt(2*i)
print "Fini"
c4d.StatusClear()
return c4d.BaseObject(c4d.Ocube)
if __name__ == "__main__":
plugins.RegisterObjectPlugin(id=MODULE_ID, str="Essai",
g=Essai,
description="roundedtube", icon=None,
info=c4d.OBJECT_GENERATOR)
Alors j'ai lu dans la doc que la fonction GetVirtualObjects() était utilisée dans un fil d'exécution :
Donc je commence à jouer avec la classe BaseThread :Citation:
Sauf que maintenant, au moindre fait et geste, la boucle est interrompue. : PCode PHP:
def GetVirtualObjects(self, op, hierarchyhelp):
#c4d.StopAllThreads()
fil = c4d.threading.GeGetCurrentThread()
for i in xrange(5000000) :
c4d.StatusSetBar(i * 0.00002)
a = math.sqrt(2*i)
if fil.TestBreak() :
print "Coupe"
break
print "Fini"
c4d.StatusClear()
return c4d.BaseObject(c4d.Ocube)
Je me demande s'il n'y a pas une solution plus sage, car les objets de type Déformateurs (c4d.OBJECT_MODIFIER) peuvent s'annuler d'office, sans qu'on ait rien à bidouiller dans le code. D'autant plus que la classe BaseThread est assez maigre en fonctions.