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 :This function is called in a thread context. Please see the important information about threading.
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.
Dernière modification par César Vonc ; 08/09/2013 à 11h57.
si tu regardes l'exemple du roundtube en c++ il utilise le testBreak.
Par contre il utiliser le HierarchyHelp fourni dans la fonction GetVirtualObject pour obtenir le thread avec un hh->GetThread()
la fonction GeGetCurrentThread est à mon avis trop générique et ne renvoie pas le bon thread à tester.
Le problème c'est que je sais pas si la fonction GetThread est dispo dans la classe HierarchyHelp en python.
J'ai essayé une fois d'utiliser ça en c++ et ça coupé effectivement tout le temps.
edit :
essayes quand même avec un
hierarchyhelp.GetThread()
la fonction est peut être présente mais non documenté
et en passant il faut aussi vérifier que le thread existe bien et qu'il n'a pas été "cassé"
Dernière modification par valkaari ; 08/09/2013 à 18h12.
Il ne semble y avoir hélas aucune fonction en Python dans le hierarchyhelper :
De même pour les autres fonctions (GetMg, GetDocument...), snif. J'ai essayé dans la démo de la R15, pour info.AttributeError: 'PyCObject' object has no attribute 'GetThread'
Je vais continuer de creuser la question.
salut
une idée en passant :
pourquoi ne pas utiliser une autre fonction pour ta boucle : la fonction while
cette fonction est directement conditionnel
une boucle du genre
des que la condition du while n'est plus respectée ta boucle s 'arrêteCode:while ( i < 50000) : c4d.StatusSetBar(i * 0.00002) a = math.sqrt(2*i) if ( test == ta_condition) : i = 500001 i = i+1
Le soucis est que la condition à vérifier donnera toujours la même réponse étant donné que C4D restera figé tant que la boucle ne sera pas terminée.
Il n'y a apparemment que la fonction TestBreak() qui permet de dire à C4D d'aller voir s'il n'y a pas d'évènement demandant l'arrêt du fil d'exécution.
Sauf que comme l'a signalé Val, GeGetCurrentThread() est trop générique et ne renvoie probablement pas le fil dans lequel s'exécute la boucle.
si tu trouves ça m’intéresse hein ^^ ou yann, qui traine dans le coin je t'ai vu !!!