Boutique Cinema 4D
Page 1 sur 4 123 ... DernièreDernière
Affichage des résultats 1 à 30 sur 101

Discussion: SubdiviCerce & Fractales

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

    SubdiviCerce & Fractales

    Dernière mise à jour : 12 mail 2010.

    SubdiviCerce

    Script permettant de subdiviser une cerce selon la méthode Catmull-Clark ou certaines courbes fractales.

    Le motif fractal peut être facilement personnalisable.


    Télécharger





    Plus d'images :
    http://www.frenchcinema4d.fr/forum/i...1333#msg491333
    http://www.frenchcinema4d.fr/forum/i...1501#msg491501
    http://www.frenchcinema4d.fr/forum/i...2454#msg492454

    Dernière édition : Personnaliser le motif fractal.

    -------


    Bonjour,

    J'aimerais copier un objet à partir du Lien de mes Données Utilisateur, mais tel que je l'ai fait, ça ne fonctionne pas :


    main(doc,op)
    {
    var objet_source = op#ID_USERDATA:3;
    var copie_objet = objet_source->GetClone(0);
    {
    doc->InsertObject(copie_objet,op,NULL);
    }
    }


    Je débute en Coffee, j'ai essayé en plaçant un FindObject un peu n'importe où autour de mon #ID_USERDATA:3, mais je dois mal m'y prendre.



    J'aimerais ensuite que cette copie se retrouve dans #ID_USERDATA:4 (j'imagine que c'est la même chose que de récupérer l'info, mais en sens inverse).

    Il se trouve que cet objet est un cerce que j'aimerais subdiviser automatiquement, pour éviter d'avoir à le faire à la main avec l'outil subdivision (je n'ai rien trouvé à ce sujet pour le faire).

    Ceci pour un traitement extérieur dans XPresso qui est déjà plus ou moins prêt, c'est vraiment ce morceau dans Coffee que je n'arrive pas à faire malgré mon acharnement (rien que de trouver comment intégrer une Donnée Utilisateur dans Coffee, j'ai mis un temps fou).

    Votre aide serait la bienvenue !
    Dernière modification par César Vonc ; 31/10/2010 à 13h02.

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

    Re*: Copier un objet et le subdiviser

    Ah non, je n'ai rien dit ! Ça fonctionne mais ça me le copiait en sous-objet de l'objet contenant la propriété Coffee.

    Du coup j'ai ajouté :

    main(doc,op)
    {
    var objet_source = op#ID_USERDATA:3;
    var copie_objet = objet_source->GetClone(0);

    var activation = op#ID_USERDATA:1;

    if ((activation==1)
    {
    doc->InsertObject(copie_objet,doc,NULL);
    op#ID_USERDATA:4 = copie_objet;
    }
    }


    Ça fonctionne, mais il me créé une copie indéfiniment... quelle condition ajouter pour n'en faire qu'une ?

    En changeant op par doc, l'expression ne fonctionne plus, alors que je veux simplement qu'il me le copie dans le document.

    Il reste toujours de soucis de subdivision où je nage complètement.

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

    Re*: Copier un objet et le subdiviser

    à chaque mise à jour de l'interface, le code est exécuté et remis à neuf donc une simple condition ne suffira pas.

    moi je mettrais une case à cocher que je désactiverais une fois l'objet crée. la condition pour créer l'objet que la case à cochée soit vrai donc cochée.

    pour insérer ton objet t'as juste à mettre NULL comme objet parent
    doc->InsertObject(copie_objet, NULL,NULL) ;

    ou
    doc->InsertLast (copie_objet); pour le mettre en bas de ta hiérarchie. (enfin un truc du genre ><)

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

    Re*: Copier un objet et le subdiviser

    Ah merci, ça marche bien en mettant NULL.

    Pour la case à cocher, c'est mon :
    var activation = op#ID_USERDATA:1;

    Le problème, c'est que le logiciel s'actualise déjà deux fois le temps que j'aille décocher la case ; je me retrouve avec deux copies.

    Sinon, des idées pour subdiviser ?

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

    Re*: Copier un objet et le subdiviser

    non ben décoche la case dans ton code ^^

    op#ID_USERDATA:1 = false

    avant l'insertion dans le doc.

    pour la subdivision tu peux faire des callcommand(numéro de la commande)

    pour t'aider tu peux ouvrir le gestionnaire de commandes, taper "script log" et cliquer sur le bouton exécuter. ça t'ouvrira la fenêtre des commandes passées. tu coups tu peux faire tes commandes à la souri et copier coller les commandes du script log.

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

    Re*: Copier un objet et le subdiviser

    Pratique dis donc, ces commandes directement visibles dans l'Historique de Script (je ne trouvais rien avec script log, j'imagine que c'est la même chose).

    J'ai donc trouvé ma commande : CallCommand(14047); // Subdiviser...
    Que j'applique après être passé en mode point : CallCommand(12139); // Points

    Je les incruste donc à la suite de l'insertion de mon objet et... ça ne marche pas.

    J'ai pu trouver sur un site qu'il fallait sélectionner l'objet avant avec doc->SetActiveObject();

    Je l'ajoute, mais rien à faire. Seule la sélection de l'objet fonctionne.

    main(doc,op)
    {
    var objet_source = op#ID_USERDATA:3;
    var copie_objet = objet_source->GetClone(0);
    var activation = op#ID_USERDATA:9;


    if (activation == true)
    {
    op#ID_USERDATA:9 = false;
    doc->InsertObject(copie_objet,NULL,NULL);
    doc->SetActiveObject(copie_objet);
    CallCommand(12139); // Points
    CallCommand(14047); // Subdiviser...
    op#ID_USERDATA:4 = copie_objet;
    }
    }


    Où ai-je faux ?

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

    Re*: Copier un objet et le subdiviser

    heu en fait je crois bien qu'on ne peut pas passer de paramètres à un callcommand. Ce qui exclus l'utilisation de toutes les commandes ou il faut en entrer (c'est à dire beaucoup) dans un tag coffee.... j'avais oublié ...

    je sais pas si on peut utiliser la commande SendModellingCommand dans un tag coffee.

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

    Re*: Copier un objet et le subdiviser

    Je confirme CallCommand() et SendModellingCommand() ne fonctionnent à ma connaissance ni dans un tag ni dans un noeud COFFEE. Il faut passer par un plugin COFFEE.

    Par contre cela fonctionne dans le gestionnaire de script. Il y a un exemple d'utilisation ici (en bas) : http://www.frenchcinema4d.fr/forum/i...?topic=25880.0

    Sinon tu as le Python et Py4D avec mon tuto :http://www.frenchcinema4d.fr/forum/i...?topic=25634.0. Là tu peux envoyer des commandes d'où tu veux, et si tu débutes ce sera à mon avis plus simple que le COFFEE

    Si tu nous en disais un peu plus sur la finalité du truc, ta démarche m'a l'air un peu complexe ...

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

    Re*: Copier un objet et le subdiviser

    Je cherche à lisser une cerce avec la méthode Catmull-Clark, car je trouve ça fort dommage d'avoir B-Spline, Akima, Cubique, Bézier, mais pas Catmul-Clark qui est utilisé dans l'HyperNurbs.

    J'ai pu dénicher plus ou moins le procédé du lissage Catmull-Clark sur la toile.
    Coffee me sert à copier la cerce automatiquement et la subdiviser, Xpresso à bouger les points pour créer l'arrondi.

    Pour l'instant, ça fonctionne si je pense à subdiviser à la main. Une fois ceci fait, je n'ai plus qu'à dire à quels points de ma cerce je veux du lissage (Il suffit de faire rapidement défiler le champs Indice du point pour affecter toute la cerce).

    J'ai aussi rajouté l'intensité de la courbure, (de grandes valeurs permettent de denteler la cerce).




    Je vais essayer avec le gestionnaire de script, seulement, est-ce qu'il est facilement transportable (pour en faire profiter aux autres, par exemple) ?

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

    Re*: Copier un objet et le subdiviser

    Citation Envoyé par César G.
    Je vais essayer avec le gestionnaire de script, seulement, est-ce qu'il est facilement transportable (pour en faire profiter aux autres, par exemple) ?
    Oui c'est très facile soit tu fournis le code et les gens n'ont qu'a copier/coller dans un nouveau script ou alors tu peux dans le gestionnaire de script via le menu fichier/exporter un script. Il te fera un fichier .CSC que tu peux distribuer. L'utilisateur n'a ensuite qu'à placer ce fichier dans le dossier c4d/library/scripts et après redémarrage de c4d le script apparaîtra directement dans le menu modules externes/scripts personnalisés

    Sinon pour ta subdivision regarde peut-être dans la doc du côté de SplineObject ->GetSplinePoint()pour calculer un certain nombre de point le long de ta spline et du côté de VariableChanged il y a un exemple de code pour ajouter des points à un point object (donc valable pour les splines)

  11. #11
    FC4D Puppet Avatar de BerTiN03
    Date d'inscription
    août 2006
    C4D version
    R13 Studio
    OS
    Windows 8
    Messages
    4 326

    Re*: Copier un objet et le subdiviser

    Vous êtes vraiment des malades... :o
    Qui fait le malin, tombe dans le ravin...

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

    Re*: Copier un objet et le subdiviser

    Merci ! Ça marche beaucoup mieux avec le gestionnaire de script. J'ai finalement utilisé les CallCommand.

    J'en ai donc profiter pour mettre tout mon Coffee en tant que Script personnalisé (avec une petite icône en plus, Ahlala ^^).
    Est-ce qu'il y a moyen d'exécuter ce script via les Données utilisateur ? Ou bien de copier l'interface de mes Données utilisateur dans le Script personnalisé ?

    Histoire d'avoir tous mes menus à un seul endroit (car pour l'instant, je règle avec mes Données utilisateur, exécute mon script séparément pour ensuite retourner dans mes Données utilisateur).

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

    Re*: Copier un objet et le subdiviser

    Tu peux créer une interface complète avec un script. Le seul soucis c'est qu'une fois la fenêtre ouverte, elle prends la main tant qu'elle est ouverte ....

    sauf si on peu créer une fenêtre nodal dans un script mais j'ai un doute...

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

    Re*: Copier un objet et le subdiviser

    Ah, et comment fait-on cela ?

    J'ai trouvé quelques exemples d'interface sur le site de xs yann, mais elles sont en .cof, je n'arrive pas à les éditer pour voir ce qu'elles ont dans le ventre (j'ai essayé de les importer dans le gestionnaire de script, mais ça ne fonctionne pas).

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

    Re*: Copier un objet et le subdiviser

    Via les fonctions CreateLayout de la classe GeDialog.

    Il te faut les fonctions CreateLayout, Init, Command et Message au minimum pour fonctionner même si elles ne renvoient rien.
    init est exécuté au lancement de l'interface, command c'est quand il se passe un truc dans ton interface, message c'est pour la gestion des messages comme un drag and drop.

    Tient si tu veux un exemple y a le script de nitroman Xbreaker pour casser des trucs.
    http://nitro4d.x10hosting.com/Download.html

    Ca montre qu'il y a quand même pas mal de possibilités via le script manager.

    Et pour info le SDK 9.5 coffee c'est le meilleur pour coffee et de loin.

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

    Re*: Copier un objet et le subdiviser

    J'ai tenté d'éplucher le script de nitroman pour voir comment était fait l'interface, mais vu la taille du script, j'ai vraiment du mal à m'y retrouver.

    Je crois que tu surestimes mon niveau en Coffee, je ne le touche réellement que depuis une semaine.

    J'ai tenté ça :

    Code:
    var t1="foireux";
    
    /// Menu
    class Menu:GeDialog {
       public:
       CreateLayout();
       Command(id,msg); 
       Init();
       }
    
    Menu::Init()
    {
    }
    
    Menu::CreateLayout()
    {
    SetTitle("ESSAI Interface");
    AddStaticText(1,BFH_SCALEFIT,0,0,"Ceci est un essai "+ t1 +" d'interface",1);
    }
    
    Menu::Command(id,msg)
    {
    }
    Pour afficher juste un texte, mais aucune fenêtre ne s'ouvre quand je lance mon script.

    Je crois que le mieux (et le plus propre) serait que je convertisse tout mon Xpresso en script ; que ma cerce se subdivise et se lisse rien qu'en l'exécutant.

    Pour l'instant, j'aimerais déjà arriver à afficher ma fenêtre d'interface.

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

    Re*: Copier un objet et le subdiviser

    Donc la t'as construit ta class Menu qui est en fait la fenêtre.
    Maintenant il faut créer un nouvel objet de cette class et appeler la commande open (de la class hérité GeDialog)


    dlg=new(Menu);
    dlg->Open(-1, -1);

    Ces deux commandes tu peux les inclures dans une fonction main mais je suis pas certain que ce soit obligatoire dans un script

    main (doc,op) {
    dlg=new(Menu);
    dlg->Open(-1,-1);
    }


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

    Re*: Copier un objet et le subdiviser

    J'ai ajouté ce que tu m'as dit à la suite de mon script, mais aucune fenêtre ne s'ouvre pour autant (j'ai essayé avec et sans la fonction Main).

    Que signifient les (-1,-1) de Open ?

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

    Re*: Copier un objet et le subdiviser

    Code:
    var t1="foireux";
    var dlg;
    
    class Menu:GeModalDialog {
       public:
       CreateLayout();
    			Command(id,msg); 
       Init();
       };
    Menu::Init() 
    {
    }
    
    
    
    
    
    Menu::CreateLayout() 
    {
    SetTitle("ESSAI Interface");
    AddStaticText(1,BFH_SCALEFIT,0,0,"Ceci est un essai "+ t1 +" d'interface",1);
    
    return TRUE;
    }
    
    
    
    
    
    Menu::Command(id,msg) 
    {
    
    }
    
    main(doc,op) {
    dlg =new(Menu);
    dlg->Open(-1, -1);
    }
    testé

    le main est visiblement obligatoire si tu veux faire des scipt complexe (avec création de class etc)

    pour le -1,-1 il sagit des coordonnées de la position d'ouverture de la fenêtre, si c'est -1,-1 la fenêtre s'ouvre à la position courante de la souris.

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

    Re*: Copier un objet et le subdiviser

    Merci !
    J'ai pu réaliser ma petite interface sans problème.



    Le seul petit soucis est au niveau du bouton d'exécution. Actuellement il fonctionne (sans que je comprenne vraiment pourquoi), mais le fait de fermer la fenêtre active le script également.


    J'aimerais ensuite sélectionner un point sur deux de ma cerce pour leur affecter à chacun une nouvelle position (position dépendante du point d'indice supérieur et inférieur de chaque point, et d'un petit calcul).

    Alors je sais qu'il y a un GetSplinePoint() dans le lot, mais j'arrive vraiment pas à m'en servir...

    Je vous montre mon code au cas où (j'ai tout commenté pour me faciliter la lecture) :

    Code:
    var t1="Lisser une cerce"; // Titre
    var t2="Veuillez sélectionner une cerce à lisser."; // Message d'erreur
    var t3="Infos"; // Infos
    var t4="Lisser"; // Bouton
    var t5="Intensité de la courbure"; // Pourcentage
    var t6="Catmull-Clark : 25 %"; // Catmull-Clark.
    var dlg;
    
    //// MENU ////
    
    class Menu:GeModalDialog {
       public:
       CreateLayout();
    			Command(id,msg); 
       Init();
       };
    
    
    
    /// INIT ///
    Menu::Init() 
    {
    
    // ID, Valeur initiale, Valeur Min, Valeur Max, Pas.
    SetPercent(4,25,-9999,9999,1); 
    
    }
    
    
    
    /// INTERFACE ///
    Menu::CreateLayout()
    {
    // Titre.
    SetTitle(t1);
    
    // Texte statique.
    AddStaticText(1,BFH_SCALEFIT,0,0,t3,1);
    
    // Groupe
    AddGroupBeginV(6,BFH_SCALEFIT,2,"Group",0); 
    {
    AddGroupBorder(BORDER_GROUP_IN);
    AddGroupBorderSpace(2,2,2,2); // Bordures d'espace (Gauche, Haut, Droite, Bas).
    AddStaticText(5,0,0,0,t5 +" :",0); // Intensité de la courbure.
    AddEditNumberArrows(4,BFH_SCALEFIT,50,10); // Pourcentage.
    AddStaticText(0,0,0,0,t6,0); // Catmull-Clark.
    AddGroupEnd();
    }
    
    
     // Bouton Lisser (ID, Style, Largeur, Hauteur, Texte).
    AddButton(3, BFH_SCALEFIT,200,30,t4);
    
    return TRUE;
    }
    
    
    
    /// COMMANDES ///
    Menu::Command(id,msg) 
    {
    
    if (id==3)
    {
    Close();
    }
    
    }
    
    
    ////////////////
    
    
    main(doc,op)
    {
    
    // Je cherche l'objet sélectionné.
    var source = doc->GetActiveObject();
    
    // Si je ne le trouve pas : message d'erreur et quitter.
    if (source==0){TextDialog(t2, DLG_OK);return(0);}
    
    // Création et ouverture du Menu à la position de la souris.
    dlg =new(Menu);
    dlg->Open(-1, -1);
    
    // Je créé une copie intégrale de l'objet sélectionné.
    var copie = source->GetClone(0);
    
    // J'insère l'objet copié dans le document.
    doc->InsertObject(copie,NULL,NULL);
    
    // Je le sélectionne.
    doc->SetActiveObject(copie); 
    
    CallCommand(12236); // Autoriser les modifications
    CallCommand(14047); // Subdiviser...
    
    }

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

    Re*: Copier un objet et le subdiviser

    il faut créer une fonction qui vas s'exécuter quand tu vas cliquer sur le bouton.

    Dans ta fonction main tu n'auras que l'ouverture de la fenêtre.

    Dans la classe "menu", la fonction "command" vas faire appel à la fonction dans la partie "if (id == 3)..."
    Tu as crée le bouton avec cette ID.

    pour ce qui est de la partie
    if (source==0){TextDialog(t2, DLG_OK);return(0);}

    tu devrais plutôt mettre

    if (instanceof(source,Ospline){
    TextDialof(t2,DLG_OK);
    return FALSE;
    }

    par la même occasion, tu vérifies que l'objet sélectionné est bien une spline édité.


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

    Re*: Copier un objet et le subdiviser

    if (!instanceof(source,SplineObject))
    {
    TextDialog(t2,DLG_OK);
    return FALSE;
    }


    Plutôt ?


    J'ai fait ce que tu m'as dit, tout marche à merveille à condition de ne pas oublier de préciser la variable doc par :

    var doc=GetActiveDocument();

    dans la fonction Menu::Command(id,msg) (belle prise de tête pour trouver ça).


    Une idée pour récupérer un point sur deux, de ma cerce ?

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

    Re*: Copier un objet et le subdiviser

    Voilà un petit bout te code qui te permets de sélectionner un point sur 2 :

    Code:
    main(doc,op)
    {
    	if (op->GetType()!= Ospline) return;//vérifier d'abord si c'est bien une spline
    	var bs = op->GetPointSelection(); //on récupère le BaseSelect
    	bs->DeselectAll(); //on déselectionne
       var i;
    	for(i=0 ; i<op->GetPointCount() ; i+=2) //boucle avec un pas de 2
    	{
    		bs->Select(i);//on sélectionne le point
    	}
    	op->SetPointSelection( bs );//et on réaffecte le BaseSelect
    }
    Edit : le code sélectionne les points pairs, si tu veux les impairs initialise i à 1 : for(i=1;.......
    Dernière modification par oli_d ; 25/06/2010 à 12h02.

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

    Re*: Copier un objet et le subdiviser

    Merci bien, Oli_D.

    Si je comprends bien, la variable i indique chaque point sélectionné ?

    Pour définir la position de chaque point, pourquoi ça ne fonctionne pas en ajoutant i->SetMg(position); ?

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

    Re*: Copier un objet et le subdiviser

    la variable i est un chiffre entier, c'est ce qu'on appelle un iterateur.

    Dans une boucle for() il y a trois paramètres
    • for(i=0 on initialise la valeur de base de la variable pour la première boucle,
    • for(i=0; i<op->GetPointCount() ce second paramètre est une condition, si elle est vrai la boucle continue, si fausse on sort de la boucle ( dans ce cas tant que la valeur de i est plus petite que le nombre de points on continue),
    • for(i=0; i<op->GetPointCount(); i+=2) là c'est la valeur que prend la varible i à chaque passage, donc dans ce cas elle va rajouter 2 à sa valeur on peut aussi le noter i=i+2, si tu veux que la valeur prenne 1 tu écriras i=i+1 ou la même chose en plus court : i++


    si tu veux modifier des points :

    Code:
    main(doc,op)
    {
     var i;
    	for(i=0 ; i<op->GetPointCount() ; i+=2) //boucle avec un pas de 2
    	{
    		var pt = op->GetPoint(i); // on récupère le point n°i sous forme de vecteur
    		pt.y = 100; // on attribue 100 en Y attention c'est en local!
    		op->SetPoint(i,pt); //et on réinjecte ce vecteur dasn le point n°i
    	}
    	op->Message(MSG_UPDATE);//important pour que l'objet soit mis à jour
    }

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

    Re*: Copier un objet et le subdiviser

    Très bien expliqué, tout est limpide.

    J'ai donc pu (enfin) finir mon script de lissage de cerce qui marche désormais parfaitement !

    Quelques petites images :

    À gauche : la cerce d'origine, à droite : celle après le script.


    En changeant la courbure, on obtient un résultat amusant.



    Je vais donc pouvoir commencer à m'intéresser à de nouvelles méthodes de lissage que Catmull-Clark (telles que Doo-Sabin, Loop, Butterfly...), et passer à la 3d... dans une autre version de ce script.


    Je peaufine encore l'icône et quelques petits trucs, puis je publierai le script (je renommerai mon sujet en conséquence (d'ailleurs, peut-être faudrait-il le déplacer dans le forum Coffee ?)).

    Le seul petit bémol est d'avoir la fenêtre de la commande Subdiviser nous demandant de combien on veut subdiviser, alors qu'il faut mettre 2 (la valeur par défaut) pour que le script fonctionne correctement.
    La cerce doit être de type Linéaire.

    Voici le code actuel, quasi définitif :

    Code:
    var t1="Lisser une cerce"; // Titre
    var t2="Veuillez sélectionner une cerce éditable."; // Message d'erreur
    var t3="Lissage d'une cerce. Par César (cesar3d.fr)"; // Infos
    var t4="Lisser"; // Bouton
    var t5="Intensité de la courbure"; // Pourcentage
    var t6="Catmull-Clark : 25 %"; // Catmull-Clark.
    var t7="Je remercie Oli_D et Valkaari pour leur précieuse aide.";
    var dlg;
    
    
    //// MENU ////
    
    class Menu:GeModalDialog {
       public:
       CreateLayout();
    			Command(id,msg); 
       Init();
       };
    
    
    
    /// INIT ///
    Menu::Init() 
    {
    	SetPercent(4,25,-9999,9999,1); 	// ID, Valeur initiale, Valeur Min, Valeur Max, Pas.
    }
    
    
    
    /// INTERFACE ///
    Menu::CreateLayout()
    {
    	SetTitle(t1); // Titre.
    
    	AddStaticText(1,BFH_SCALEFIT,0,0,t3,1); // Texte statique.
    	
    	AddGroupBeginV(6,BFH_SCALEFIT,2,"Groupe",0); // Groupe
    	{
    		AddGroupBorder(BORDER_GROUP_IN);
    		AddGroupBorderSpace(2,2,2,2); // Bordures d'espace (Gauche, Haut, Droite, Bas).
    		AddStaticText(5,0,0,0,t5 +" :",0); // Intensité de la courbure.
    		AddEditNumberArrows(4,BFH_SCALEFIT,50,10); // Pourcentage.
    		AddStaticText(0,0,0,0,t6,0); // Catmull-Clark.
    		AddGroupEnd();
    	}
    
    	AddButton(3, BFH_SCALEFIT,200,30,t4); // Bouton Lisser (ID, Style, Largeur, Hauteur, Texte).
    
    	AddStaticText(7,BFH_SCALEFIT,0,0,t7,1); // Texte de rerciements.
    
    	return TRUE;
    }
    
    
    
    /// COMMANDES ///
    Menu::Command(id,msg) 
    {
    	if (id==3) // Si le bouton est enclenché...
    	{
    		
    		var doc=GetActiveDocument(); // J'attribue la variable doc au document actif.
    		var source = doc->GetActiveObject(); // Je cherche l'objet sélectionné.
    		var copie = source->GetClone(0); // Je créé une copie intégrale de l'objet sélectionné.		
    		doc->InsertObject(copie,NULL,NULL); // J'insère l'objet copié dans le document.
    		doc->SetActiveObject(copie); // Je sélectionne l'objet copié.
    		CallCommand(12236); // Autoriser les modifications
    		CallCommand(14047); // Subdiviser...
    
    		var bs = copie->GetPointSelection(); // Je récupère la sélection de base.
    		bs->DeselectAll(); // Je déselectionne.
        var i;
    		for(i=0 ; i<copie->GetPointCount() ; i+=2) // Boucle avec un pas de 2. i=1 pour les points impairs.
    		{
    			var pt = copie->GetPoint(i); // Je récupère le point n°i sous forme de vecteur.
    			var pto = copie->GetPoint(i);
    			var ferme = (copie->GetContainer())->GetData(SPLINEOBJECT_CLOSED); // Je regarde si ma cerce est fermée.
    
    					var courbure = 0.02*GetPercent(4); // Je récupère la valeur de mon bouton d'ID n°4.
    
    						var sup = 1;
    								if ((i == copie->GetPointCount()-1) && (ferme==TRUE)) sup = -1; // Si i est le dernire point, le point suivant est le premier.
    					 		if ((i == copie->GetPointCount()-1) && (ferme==FALSE)) sup = 0;
    						var inf = -1;
    								if ((i == 0) && (ferme==TRUE)) inf = copie->GetPointCount()-1; // Si i est le premier point, le point précédent est le dernier.
    								if ((i == 0) && (ferme==FALSE)) inf = 0;
    
    			var ptsup = copie->GetPoint(i+sup); // Point supérieur.
    			var ptinf = copie->GetPoint(i+inf); // Point inférieur.
    
    			pt = (((ptsup*courbure) + (pto*(1-courbure)))*0.5) + (((ptinf*courbure) + (pto*(1-courbure)))*0.5); // J'attribue une nouvelle coordonnée à ce point.
    			copie->SetPoint(i,pt); // Et je réinjecte ce vecteur dans le point n°i.
    			bs->Select(i); // Je sélectionne le point.
    		}
    		copie->SetPointSelection( bs ); // Et je réaffecte la sélection de base.
    		copie->Message(MSG_UPDATE);// Important pour que l'objet soit mis à jour.
    		CallCommand(13324); // Tout désélectionner
    		Close();
    	}
    }
    
    
    ////////////////
    
    main(doc,op)
    {
    
    // Je cherche l'objet sélectionné et l'attribue à une variable.
    var selection = doc->GetActiveObject();
    
    // Si ce n'est pas une cerce : message d'erreur et quitter.
    if (!instanceof(selection,SplineObject))
    {
    	TextDialog(t2,DLG_OK);
    	return FALSE;
    }
    
    // Création et ouverture du Menu à la position de la souris.
    dlg =new(Menu);
    dlg->Open(-1, -1);
    
    }

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

    Re*: Copier un objet et le subdiviser

    :efface: Bravo et bienvenue dans le coté obscur de C4D !

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

    Re*: Copier un objet et le subdiviser

    illllllll est des noooooooootreeeeeeeeeeeeeeeee il a fait son script comme les autrrrrrrrresssssss......

    Par contre pour ce qui est de la subdivision tu peux la coder toi même, surtout si c'est pour mettre un point entre les points existant. C'est juste une moyenne des deux coordonnées si la spline est en linéaire.


  29. #29
    Vieux Croûton Avatar de Sir Gong
    Date d'inscription
    juillet 2002
    C4D version
    R19 Studio
    OS
    10.13.4 High Sierra
    Messages
    10 353
    Billets dans le blog
    2

    Re*: Copier un objet et le subdiviser

    Citation Envoyé par César G.
    (d'ailleurs, peut-être faudrait-il le déplacer dans le forum Coffee ?)).
    voilà c'est fait.

    (c'est la seule phrase que j'ai comprise dans ce sujet)
    ÷ R19 Studio ÷ cacahuètes ÷

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

    Re*: Copier un objet et le subdiviser

    Pour ce qui est de la subdivision, j'ai été voir l'exemple de l'utilisation de la fonction VariableChanged, mais c'est en C++ et non en Coffee.

    J'ai pu ajouter un point grace à un exemple trouvé sur la toile, mais il s'ajoute à la fin de ma cerce, j'aimerais pouvoir lui dire à quel indice s'ajouter. Une idée ?

    Code:
    var cerce = doc->GetActiveObject();
    
    var vc = new (VariableChanged); if(!vc) return;
    var cnt = cerce->GetPointCount();
    
    vc->Init(cnt,cnt+1); // Ajout d'un point.
    
    
    var ok = cerce->MultiMessage(MSG_POINTS_CHANGED, vc);
    
    
    var p1 = vector(10,10,10);
    
    cerce->SetPoint(cnt,p1); 
    
    cerce->Message(MSG_UPDATE);

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