Boutique Cinema 4D
Affichage des résultats 1 à 8 sur 8

Discussion: Générateur non bloquant

Vue hybride

  1. #1
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483

    Générateur non bloquant

    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.

    Code PHP:
    class Essai(plugins.ObjectData):

        
    def __init__(self):
            
    self.SetOptimizeCache(True)

        
    def GetVirtualObjects(selfophierarchyhelp):
            
            for 
    i in xrange(5000000) :
                
    c4d.StatusSetBar(0.00002)
                
    math.sqrt(2*i)
            
            print 
    "Fini"
            
    c4d.StatusClear()
            
            return 
    c4d.BaseObject(c4d.Ocube)

    if 
    __name__ == "__main__":
        
    plugins.RegisterObjectPlugin(id=MODULE_IDstr="Essai",
                                    
    g=Essai,
                                    
    description="roundedtube"icon=None,
                                    
    info=c4d.OBJECT_GENERATOR
    Actuellement, on est obligé d'attendre que la boucle se termine, C4D ne veut rien entendre pendant.


    Alors j'ai lu dans la doc que la fonction GetVirtualObjects() était utilisée dans un fil d'exécution :
    This function is called in a thread context. Please see the important information about threading.
    Donc je commence à jouer avec la classe BaseThread :

    Code PHP:
    def GetVirtualObjects(selfophierarchyhelp):
            
            
    #c4d.StopAllThreads()
            
    fil c4d.threading.GeGetCurrentThread()
            
            for 
    i in xrange(5000000) :
                
    c4d.StatusSetBar(0.00002)
                
    math.sqrt(2*i)
                if 
    fil.TestBreak() :
                    print 
    "Coupe"
                    
    break
            
            print 
    "Fini"
            
    c4d.StatusClear()
            
            return 
    c4d.BaseObject(c4d.Ocube
    Sauf que maintenant, au moindre fait et geste, la boucle est interrompue. : P



    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.

  2. #2
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    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.

  3. #3
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Il ne semble y avoir hélas aucune fonction en Python dans le hierarchyhelper :

    AttributeError: 'PyCObject' object has no attribute 'GetThread'
    De même pour les autres fonctions (GetMg, GetDocument...), snif. J'ai essayé dans la démo de la R15, pour info.

    Je vais continuer de creuser la question.

  4. #4
    Pilier Avatar de paspas
    Date d'inscription
    février 2004
    Messages
    990
    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
    Code:
    while ( i < 50000) : 
        c4d.StatusSetBar(i * 0.00002)
        a = math.sqrt(2*i)
        if ( test == ta_condition) :
            i = 500001
         i = i+1
    des que la condition du while n'est plus respectée ta boucle s 'arrête

  5. #5
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    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.

  6. #6
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    si tu trouves ça m’intéresse hein ^^ ou yann, qui traine dans le coin je t'ai vu !!!

Discussions similaires

  1. ivy generateur
    Par foubrun dans le forum Nouveaux membres
    Réponses: 7
    Dernier message: 09/07/2010, 07h59
  2. Générateur de rails
    Par arno dans le forum MoGraph
    Réponses: 4
    Dernier message: 13/06/2008, 09h42
  3. Génerateur de visage 3D
    Par sinclairzxfr dans le forum Compatibilité
    Réponses: 3
    Dernier message: 18/12/2005, 22h59
  4. Générateur de caustiques
    Par archeo dans le forum Textures
    Réponses: 3
    Dernier message: 07/08/2004, 01h30
  5. Générateur à Plasma !
    Par khadgar dans le forum Travaux en cours
    Réponses: 16
    Dernier message: 18/05/2004, 22h33

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet