Hello !
Donc voici mon premier script python (bon j'en ai déjà fait mais des simple copié collé de l'historique ^^) alors j'ai bien conscience que le code est dégueux d'ailleurs y a un ou deux trucs que j'ai récupéré dans d'autres scripts
Alors comme vous pouvez le voir le but est de sélectionner une arête ou un ensemble d'arêtes puis de repassé en mode point pour sélectionner celui qui sera la référence pour l'alignement , on choisi ensuite l'axe de l'alignement.
Bon je ne sais pas si il y avait une méthode plus simple mais perso j'aime bien cette méthode.
LK_AlignFromPoint.zip
Voici les trois scripts pour XYZ ainsi que les tif (fait à la va vite ^^)
il faudra que je m'y mette un jour.. ça me fascine .. dommage qu'on ait qu'une vie (enfin il semblerait)
pour un béotien qui débuterait dans le langage "serpent" tu commencerais comment ? un site à explorer ? un livre à lire, un lieu où on peut trouver des exercices ??
j'en suis resté au basic.. donc il y a du boulot..
Dernière modification par ozchan ; 16/06/2017 à 16h00.
Oser rêver, et mentir
Houlas ! Je suis aussi un débutant j'ai des connaissances en javascript mais pour le python bein j'imagine qu'il y a pas mal de vidéos youtube ou de site qui traite le python en générale. Sinon j'ai vu que Gr4ph0s à fait des vidéos intéressantes sur sa chaine vimeo :
01 - Introduction au python dans cinema 4D
https://vimeo.com/181392492
Pas mal du tout pour un "débutant" j'aurais aimer débuter comme toi :p
Au niveau de ton code pas grand chose à dire.
Tu devrais garder une copie des selections. J'aime pas quand un outil les change. Pour cela il te suffit de copier le baseSelect via BaseSelect.GetClone puis après tu fais un BaseSelect.CopyTo( obj.GetPointS())
Plutôt que de check au milieu de ton code (ligne 7 par exemple) que op existe, fait le des le début. C'est bien plus simple à lire, comme ça on sais direct que tu veux que sa sois un objet et rien d'autre.
Du coup sa donnerais un turc dans le style
Après tu as oublier de faire un StartUndo()Code:op = doc.GetActiveObject() if not op: return if not isinstance(op, c4d.PointObject): return
Et pour finir je serais toi je switcherais pour un plugin, sa te permettrais d'avoir un code beaucoup plus maintenable, car la tes 3 code se ressemble fortement, et si tu as plusieurs changements à faire, bha t'es obligé de le faire dans les 3 fichiers (alors pour ce projet ça reste acceptable mais bon autant faire bien des le début :p)
Mais sinon encore une fois gg, et très utile.
Je pense qu'il complete bien mon plug de snap avec constrainte, vu que toi il fonctionne dans un espace local à l'objet tandis que le mien est dans l'espace global de la scène !
J'en profite pour singaler que je l'ai mise à jour. Pas mal de chose on changé depuis la dernière version que j'ai posté ici, plus optimisé, la possibilité de sélectionner / désélectionner, la possibilité de pouvoir snap depuis plusieurs objets sélectionné, et le fix de 2 bug qui faisais crash.
SDK Specialist
MAXON Computer GmbH
Merci gr4ph0s pour ton retour,
Pour la copy de la sélection je l'a récupérait bien mais d'une façon dégueux (je vais tenter de corriger ça avec ta méthode) .
ah ok encore un truc que j'ai mal compris je pensais que ça équivalait a un StartUndo :
Code:doc.AddUndo(c4d.UNDOTYPE_CHANGE, op)Va falloir que je regarde comment fonctionne ainsi que pour la création d'Ui mais oui tu as raison.Et pour finir je serais toi je switcherais pour un plugin, sa te permettrais d'avoir un code beaucoup plus maintenable, car la tes 3 code se ressemble fortement, et si tu as plusieurs changements à faire, bha t'es obligé de le faire dans les 3 fichiers (alors pour ce projet ça reste acceptable mais bon autant faire bien des le début :p)
Ah ouais top ton plugin il va falloir que je le test ;-) !Je pense qu'il complete bien mon plug de snap avec constrainte
Merci pour tout tes conseils gr4ph0s
Bon j'ai encore du boulot ... est ce que vous savez si il y a un moyen en python de récupéré le centre d'une sélection de point ?
Pour les undos je te conseille de lire la doc C++ ainsi que ce thread
https://developers.maxon.net/docs/Ci...nual_undo.html
http://www.plugincafe.com/forum/foru....asp?TID=12227
Pour récupérer le centre tu peux faire une moyenne (ce ne sera pas le centre mais une moyenne, mais tu verras qu'au final ça donne des résultat presque similaire)
Sinon la méthode est un peu plus chiante il faut que tu créer une bouding box en recupérant max X/Y/Z et min X/Y/Z des points sélectionné puis après tu recup le centre.
Pour la méthode de la moyenne
Code:all_value = 0 selected_count = 0 bs = obj.GetPointS() #enumerate va nous retourner l'index et la valeur #index sera égal à notre pt_id et selected l'état de sélection du point for index, selected in enumerate(bs.GetAll(maxelements)): if not selected: continue #Si il n'est pas selectionné on continue notre boucle all_value += obj.GetPoint(index) selected_count += 1 #Toujorus check quand tu fais des division pour ne pas diviser par 0 if not selected_count: return center = all_value / selected_count
SDK Specialist
MAXON Computer GmbH