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

Discussion: Programmation Xpresso

  1. #1
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173

    Programmation Xpresso

    Bonjour à tous.

    Je souhaite réaliser une fonction personnalisée utilisable avec Xpresso.

    Pour l'exemple, je prendrai une fonction dans le triangle rectangle où en donnant deux dimensions en entrée, on peut calculer les 3 angles et la dimension manquante. Dans cette esprit :


    En passant par le nœud formule, à priori, on ne peut avoir qu'une sortie.

    J'envisage donc de créer un nœud Coffee et pour cela, deux questions :

    1) Est-ce la bonne/meilleure pratique à adopter ?
    2) Maxon préconise plutôt d'utiliser python mais peut-on faire la même chose en C++ ?

    Merci pour vos réponses.

  2. #2
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Tu peux faire plus de choses dans C4D en Python qu'en COFFEE, je trouve personnellement que le Python est plus facile à utiliser surtout si tu débutes.


    Je vois pas trop le rapport avec le C++ dans ton cas. Un noeud Python est pour moi la meilleure solution.



    Concernant les triangles, une petite ressource précieuse, si ça peut aider toi ou les curieux :

    https://fr.wikipedia.org/wiki/R%C3%A...39;un_triangle


    La doc Python de C4D :

    https://developers.maxon.net/docs/Ci...tml/index.html


    La doc Python du module math :

    https://docs.python.org/2/library/math.html



    Un petit projet bien sympa, en tout cas !
    Dernière modification par César Vonc ; 29/01/2017 à 20h18.

  3. #3
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Un noeud python pour commencer. Mais tout dépends de ce que tu veux en faire. Si c'est pour apprendre, c'est un bon début.

    J'utilises souvent les noeuds Python, après des générateurs python, parfois des tags pythons. J'ai parfois besoin de passer par des scripts puis après c'est carrément des plugins.

  4. #4
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Merci à vous deux pour ces conseils. Je ne connaissais pas cette page de wikipedia, elle est excellente.

    Pour le C++, c'était juste par curiosité, ayant plus de connaissance dans ce langage qu'en Python avec lequel, je dois avouer, mes expériences n'ont pas été concluantes, car pas assez structuré.

    Si je comprends bien, d'ailleurs, C4D utilise python 2.7, et n'est pas passé en 3.x....

    Je vais donc de ce pas m'y intéresser et si c'est concluant et que cela puisse servir à d'autres, je partagerai ce travail.

    PS : j'imagine qu'il n'y a pas trop de différence à ce sujet entre la R16 et la R18.
    Dernière modification par Condor34 ; 30/01/2017 à 10h21.

  5. #5
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949

    Post

    Les fonctions du SDK c++ sont ajoutés petit à petit au SDK python, les deux évoluent. Il y a donc des différences entre les versions de cinema4D. Dans la doc du SDK il y a parfois indiqué le numéro de version de cinema4D où cette commande est "apparue". S'il n'y a rien c'est que c'est là depuis longtemps ^^.


    Enfin il vaut mieux tester avant ...

  6. #6
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Aller, j'ai fait un petit effort sur python, comme ils m'avaient préparé un welcome en début de code, je me suis laissé tenter.

    C'est vrai que ne pas fermer les if... c'est difficile.


    Voici le nœud :


    et je vous joins un fichier xgr (dans le zip) à utiliser avec la fonction "charger xpool" de l'éditeur xpresso..

    Principe simple : on connait au moins deux des trois cotés du triangle, le nœud donne le reste. Le coté inconnu doit quand même être raccordé à un nœud constante à 0 pour que l'expression fonctionne. Je n'ai pas réussi à conditionner l'entrée qui n'est pas reliée pour activer l'expression sans elle.

    Maintenant que je suis chaud, je vais m'attaquer à Al Kashi (ce qui peut faire doublon, mais j'aime bien travailler uniquement avec un raisonnement de triangle-rectangle lorsque j'en ai un en face de moi)

    Pour Al-Kashi, voici un petit lien que j'utilise très régulièrement.

    http://calculis.net/triangle


    PS: Juste une petite question : comment faîtes-vous le debug de vos programmations pythons ? Est-ce possible dans C4D, ou utilisez-vous un EDI externe ? Si c'est le cas, comment lier cet EDI à C4D ?
    Fichiers attachés Fichiers attachés
    Dernière modification par Condor34 ; 30/01/2017 à 14h25.

  7. #7
    Dépendant
    Date d'inscription
    octobre 2011
    C4D version
    R15 Studio
    OS
    Win7 64 bits
    Messages
    404
    Salut,

    Pour le debug affiche la console (menu Script)

    Math

  8. #8
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Avant de t'attaquer à la loi des cosinus, tu peux aussi faire le même noeud mais avec trois points. On est dans c4d on travail plus facilement avec des coordonnées.

    Et peut être faire des calculs vectoriels à la place pour calculer les angles et l'aire.

    Une option pour que la sortie se fasse en Degrés ou en Radian. En rajoutant une donnée utilisateur par exemple ou un champs.

    Sinon, quand tu as des ports d'entrées qui ne sont pas connectés, tu as un onglet paramètre quand tu sélectionnes ton noeud. Il permet d'entrer des valeurs.

    Tu peux aussi créer des fonctions pour le calcul de tes aires et de Pythagore. (deux paramètres en entrée et un retour)

  9. #9
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Merci à vous deux.

    je vais reprendre cela en ce sens.

    Juste une précision, le paramètre par défaut (0 en l'occurrence) ne semble pas être pris en compte. J'ai été surpris c'est pour cela que j'ai raccordé un nœud constante à valeur 0.

    Peut-être une mauvaise manip de ma part.

  10. #10
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Bonsoir à tous.

    Effectivement, le calcul à partir des points est beaucoup plus judicieux.

    Avancée de la journée :


    et le code qui va avec :
    Code:
    import c4d
    
    def ctrlPlan(index):
        if Point1[index]==Point2[index]==Point3[index]:
            return True
        else:
            return False
        
    def colineaire(v1,v2):
    
        if v1[0]*v2[1] == v1[1]*v2[0] == v1[1]*v2[2] == v2[1]*v1[2]:
            return True
        else:
            return False
        
    def main():
        global Plan,V1,V2,V3,longueurV1, longueurV2, longueurV3
    
    #controle du plan de travail
        if ctrlPlan(0):
            Plan="YZ"
        elif ctrlPlan(1):
            Plan="XZ"
        elif ctrlPlan(2):
            Plan="XY"
        else:
            Plan="Plan indéterminé"
            exit
            
    #définition des vecteurs et contrôle de colinéarité
        V1 = c4d.Vector(Point2[0]-Point1[0],Point2[1]-Point1[1],Point2[2]-Point1[2])
        V2 = c4d.Vector(Point3[0]-Point2[0],Point3[1]-Point2[1],Point3[2]-Point2[2])
        V3 = c4d.Vector(Point3[0]-Point1[0],Point3[1]-Point1[1],Point3[2]-Point1[2])
        
        #if colineaire(Point1,Point2,Point3):
        if colineaire(V1,V2):
            print "Les trois points sont alignés !"
            
        
        
        longueurV1 = V1.GetLength()
        longueurV2 = V2.GetLength()
        longueurV3 = V3.GetLength()
    Beaucoup de révision sur le calcul des vecteurs aujourd'hui. Il y a bien longtemps que je n'avais fait cela, et certainement pas dans l'espace.

    Demain j'attaque les angles.

    Une petite question complémentaire : Dans les nœuds Xpresso, on peut sélectionner les données d'entrée et de sortie à partir des carrés bleus et rouges pour les activer.
    Est-il possible d'accéder à cette fonction et de rajouter les données de sorties à cette liste pour que l'utilisateur ne sélectionne que celle(s) dont il a besoin ?

  11. #11
    Pilier Avatar de oli_d
    Date d'inscription
    avril 2004
    C4D version
    Autre
    OS
    MacOS X
    Messages
    707
    Salut,

    tu peux grandement simplifier ton code en utilisant les opérateur directement sur les vecteurs. Au lieu de :
    Code:
    V1 = c4d.Vector(Point2[0]-Point1[0],Point2[1]-Point1[1],Point2[2]-Point1[2])
    Tu peux écrire (j'évite les majuscules au début des noms de variable qui sont réservées au nom de classes et comme tout codeur python je suis flemmard et p1 c'est plus court que Point1 mais tout aussi compréhensible !)
    Code:
    v1 = p1-p2
    Tu peux aussi calculer directement la longueur:
    Code:
    long1 = (p1-p2).GetLength()
    A part ça pour les vecteurs plutôt que de récupérer x,y,z avec v[0],v[1],v[2] tu peux directement récupérer v.x,v.y et v.z, ce qui est moins chiant à taper et à mon avis plus lisible

    Sinon tu peux aller regarder chez Maître Vonc pour la surface, il y a la méthode pour calculer l'aire d'un triangle ici transformée en fonction (et j'ai enlevé les majuscules aux variables, petit canaillou de César !!)

    Code:
    def aireTriangle(a, b, c) :         
        vAB = a - b
        vAC = a - c
        return vAB.Cross(vAC).GetLength() * 0.5

    https://code.vonc.fr/?a=40

  12. #12
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Le produit vectoriel (cross product), est un vecteur perpendiculaire aux deux autres. Donc il indique aussi la direction de la normal du triangle. (tout dépends du sens dans lequel on a tourné pour créer ses vecteurs). En plus de donner l'aire du triangle.

    Il faut aussi regarder du coté du produit scalaire (dot product) qui te donnera des informations sur les angles. Et du coup si les vecteurs sont colinéaire ou pas. (180°)

    C'est pour ça que c'est intéressant de regarder le calculs vectoriels dans un environnement 3D.


    J'ai pas compris la question sur les ports de sortie dans xpresso. On peut en rajouter en python mais dans ton cas je comprends pas à quoi ça pourrait te servir.

  13. #13
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Merci, merci.

    J'adore vos conseils.
    Il est vrai que découvrant le python et la biblio c4d, je n'ai pas les réflexes des codeurs habitués. Mais ces raccourcis sont vraiment efficaces, le code est beaucoup plus lisible.

    Merci aussi pour ces orientations vers des fonctions plus évoluées. J'optimiserai tout cela demain, sachant aussi que j'ai le calcul vectoriel en 3D (voire même en 2D) à (ré)-intégrer. Pour les angles, je pensais m'orienter vers les matrices, mais visiblement il y a plus simple.

    Pour la question des ports, une petite image :



    On voit qu'en sortie, par défaut c'est la quantité. Mais si on ouvre la liste du carré rouge, il est possible d'ajouter d'autres données en sortie. C'est cette présentation qu'il m'intéresserait de reproduire.

  14. #14
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949
    Je sais que c'est possible en c++.
    Avec le sdk python je sais pas trop. (il y a parfois des commandes qui manquent)
    Et via un noeud python ça m'étonnerai mais je n'ai absolument pas regardé.

  15. #15
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Bonjour à tous.

    Voici l'avancée d'aujourd'hui. Ce n'est pas que je veuille feuilletonner, mais comme j'arrive sur un os, j'en profite pour soumettre ce travail à votre regard attentif.

    Une grande partie des fonctions que je souhaitais inclure sont opérationnelles.



    Et voici le code :
    Code:
    import c4d, math
    
    def ctrlPlan(index):
        if point1[index]==point2[index]==point3[index]:
            return True
        else:
            return False
        
    def colineaire():
        if v1.x*v2.y == v1.y*v2.x == v1.y*v2.z == v2.y*v1.z:
            return True
        else:
            return False
        
    def main():
        global plan,v1,v2,v3,longueurV1, longueurV2, longueurV3, w1, w2, w3, aire, perimetre, normale, cg, angle1, angle2, angle3
    
    #controle du plan de travail
        if ctrlPlan(0):
            plan="YZ"
        elif ctrlPlan(1):
            plan="XZ"
        elif ctrlPlan(2):
            plan="XY"
        else:
            plan="Plan indéterminé"
            exit
            
    #définition des coordonnées vectorielles : |AB|=(Bx-Ax),(By-Ay),(Bz-Az)
        v1 = point2 - point1
        v2 = point3 - point2
        v3 = point3 - point1
    
        
    #Longueur des vecteurs = cotés du triangle : 
        longueurV1 = v1.GetLength()
        longueurV2 = v2.GetLength()
        longueurV3 = v3.GetLength()
        perimetre = v1.GetLength()+ v2.GetLength()+ v3.GetLength()
        
    #Vecteur orthogonal + aire
        normale = v1.Cross(v2)
        aire = normale.GetLength() * 0.5
        normale.Normalize()
        
    #Centre du triangle
        cg = c4d.Vector((point1.x + point2.x + point3.x)/3,(point1.y + point2.y + point3.y)/3,(point1.z + point2.z + point3.z)/3)
    
    #Calcul angulaire par le théorème d'Al-Kashi
    
        angle1 = math.acos((longueurV2**2 + longueurV3**2 - longueurV1**2)/(2*longueurV2*longueurV3))
        angle2 = math.acos((longueurV1**2 + longueurV3**2 - longueurV2**2)/(2*longueurV1*longueurV3))
        angle3 = math.acos((longueurV1**2 + longueurV2**2 - longueurV3**2)/(2*longueurV1*longueurV2))
    
        if degres:
            angle1 = math.degrees(angle1)
            angle2 = math.degrees(angle2)
            angle3 = math.degrees(angle3)
        
    # contrôle de colinéarité
        if colineaire():
            print "Les trois points sont alignés !"
            plan = "Points colinéaires !"
            perimetre = 0
            aire = 0
    Pour le calcul des angles, j'ai préféré Al-Kashi au produit scalaire. J'ai rencontré trop de difficulté à corriger le sens de l'opération en final et j'avais des angles complémentaires dans certaines situations. Mais ce travail n'est pas perdu.

    Maintenant l'os qu'il me reste à ronger : J'ai besoin de vectoriser HPB pour v1, v2 et v3. Quelle est la meilleure voie à suivre ?

    Merci encore à tous pour votre aide efficace.

  16. #16
    Gourou Avatar de valkaari
    Date d'inscription
    mai 2009
    C4D version
    Autre
    OS
    OSX / windows
    Messages
    2 949

  17. #17
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Je reviens vers vous pour ce développement que j'affine.

    J'ai dans ce calcul des données d'entrées optionnelles et je souhaite pouvoir identifier si une node est bien reliée à un point d'entrée.



    Dans l'image ci-dessous, pointA n'a aucune entrée. Je souhaitais tester cet état avec un classique :
    Code:
    if pointA is None :
    Or, même sans relation, l'entrée de type vecteur se voit affectée d'un (0,0,0) qui correspond à un point situé à l'origine. Donc la réponse à is None est toujours False.

    Ca ne me facilite pas la vie pour identifier si connexion ou pas.

    Existe-t-il un moyen pour tester que l'entrée est reliée ou non et plus généralement comment traitez-vous un paramètre d'entrée optionnel ?

    En synthèse, comment capturer le point ajouté au centre du cercle de l'entrée que l'on voit ici ?



    Merci pour votre aide.
    Dernière modification par Condor34 ; 03/03/2017 à 11h41.

  18. #18
    Pilier Avatar de gr4ph0s
    Date d'inscription
    mai 2013
    C4D version
    R16 Studio
    OS
    win 7 X64
    Messages
    964
    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		pic.jpg 
Affichages :	7 
Taille :		320,1 Ko 
ID : 			19539
    La je détecte par le nom mais si tu a un id é fix alors tu peux checker le port directement via port = GetInPort(tonId) et après port.IsIncomingConnected()
    Code:
    import c4d
    
    
    def main():
        global Output1
        Output1 = 0
        for i in xrange(op.GetInPortCount()):
            port = op.GetInPort(i)
            if port.GetName(op) == "Vec":
                if port.IsIncomingConnected():
                    print "connected"
                else:
                    print "not connected"
    Pour plus d'info regarde
    https://developers.maxon.net/docs/Ci...GvNode.GetPort
    https://developers.maxon.net/docs/Ci...omingConnected

    Et enfin https://gist.github.com/NiklasRosenstein/7126526 (ce mec est une mine d'or )
    Dernière modification par gr4ph0s ; 03/03/2017 à 14h08.
    SDK Specialist
    MAXON Computer GmbH

  19. #19
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Merci gr4ph0s.

    J'étais justement sur ce post, que l'on retrouve ici aussi : http://forums.cgsociety.org/archive/...t-1130386.html.

    J'étais en train de traiter avec difficulté une erreur relative à ID_USERDATA dans son code.

    Le tiens, plus simple, arrive à point.

    J'admire, toujours tes réponses sur n'importe quel problème de programmation. Chapeau bas, même si tu n'es pas seul, bien sûr.


    Donc, je continue à avancer - aussi - sur ce sujet.
    Dernière modification par Condor34 ; 03/03/2017 à 17h20.

  20. #20
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Je reviens vers vous sur ce travail toujours en cours, mais qui devrait bientôt toucher à sa fin

    Est-il possible dans le module python de c4d, de définir un vecteur par un couple (longueur, angle), plutôt que par les trois points x,y,et z habituels ?

    Ca m'aiderai pas mal car ces deux valeurs sont faciles à obtenir. Sinon, je ne vois pas encore comment passer d'une définition (lg,°) à l'autre(x,y,z).

    Merci pour votre aide.

  21. #21
    Pilier Avatar de Floc
    Date d'inscription
    novembre 2012
    C4D version
    R15 Studio
    OS
    WindOSX
    Messages
    1 617
    Pour passer de (lg,°) à (x,y,z), il faut utiliser sin et cos. Pour l'inverse c'est atan.

    Dans le petit fichier joint :
    Si tu modifie la longueur de la spline ou sa rotation le null bleu suivra. Sa position représentant le vecteur (x,y,z).
    Si tu bouge le null rouge la rotation et la longueur de la spline suivront.

    Mais ce n'est qu'en 2D. Puisque longueur et angle ne représente a priori qu' un vecteur 2D.
    Fichiers attachés Fichiers attachés

  22. #22
    Squatteur Avatar de Condor34
    Date d'inscription
    mars 2013
    C4D version
    R16 Studio
    OS
    Windows 7/64
    Messages
    173
    Donc c'est bien ce que je pensais, ça passe obligatoirement par la trigo.

    Et effectivement, la notation (Lg,°) ne peut s'appliquer que dans le plan. Mais ce plan, pour nous, étant dans un espace 3D, en rajoutant une composante z, je pensais qu'il pouvait y avoir un programmateur de génie qui nous avait déjà concocté la conversion.

    Donc, retour aux fondamentaux, sinus, cosinus tangente et toute la famille.

    Merci Floc pour ton aide.
    Dernière modification par Condor34 ; 09/03/2017 à 09h50.

Discussions similaires

  1. [Question] Programmation C4D
    Par dada dans le forum Nouveaux membres
    Réponses: 6
    Dernier message: 05/10/2016, 12h46
  2. Programmation d'une chute d'objet.
    Par baldouik dans le forum Nouveaux membres
    Réponses: 3
    Dernier message: 23/04/2012, 18h14
  3. Cinema 4d & programmation
    Par sigma6 dans le forum Nouveaux membres
    Réponses: 6
    Dernier message: 06/06/2007, 21h48
  4. Programmation et découpe.
    Par Aurety dans le forum Programmation
    Réponses: 3
    Dernier message: 26/05/2005, 02h02
  5. Programmation des jeux
    Par dr_progz dans le forum Animation
    Réponses: 5
    Dernier message: 23/12/2004, 23h29

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