Concombre_masque Posté(e) le 17 novembre 2005 Posté(e) le 17 novembre 2005 Bonjour, Est-ce qu'il est possible avec un code lisp de calculer la longueur d'une polyligne 3D, d'y appliquer une formule du type x=3100x1=((x*2)/5)+xx2=((x1*2)/5)+x1..Autant de fois que necessaire pour arriver au bout de la polyligne. Et ensuite, à chaque point x - x1 - x2... coller un bloc Je fais 20 fois par jour ce genre de dessin, la ligne rouge est une polyligne 3D et les ronds bleus sont des blocs. Je fais ca à chaque fois, à la main et j'aimerais automatiser le trucs. http://concombre.nuxit.net/temp/mur3d.jpg Question bonus, est ce que ce code peut déterminer l'angle de la polyligne par rapport au plan xy afin d'appliquer une rotation 3D à chaque bloc ? Merci de me guider. [Edité le 17/11/2005 par Concombre_masque] www.concombre-masque.com
zebulon_ Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 bonjour, Est-ce qu'il est possible avec un code lisp de calculer la longueur d'une polyligne 3D Sélectionner une polylignelancer la commande _list sur cet objetrécupérer la valeur de la variable PERIMETER Pour ce qui est de placer des blocs le long d'une polyligne 3d, je pense qu'en utilisant les commandes autocad _divide (diviser) ou _measure (mesurer), tu devrais arriver a te simplifier la vie. La commande DIVISER permet de placer un nombre déterminé d'objets[surligneur] ou de blocs [/surligneur] sur le pourtour d'un objet divisé en intervalles égaux. Les objets pouvant être divisés comprennent les arcs, les cercles, les ellipses et les arcs elliptiques, les polylignes et les splines. La commande MESURERPlace des points[surligneur] ou des blocs [/surligneur]selon des intervalles mesurés sur un objet. En plus, ces fonctions permettent d'aligner le bloc avec l'objet. Je ne sais pas si ça répond à ta demande Amicalement Zebulon_ C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
bonuscad Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 Bonjour, Une ébauche de code pour te donner le corps principal de la fonction.Il ne te reste plus qu'a paufiner. (remplacer la commande "_.point" par "_.-insert" avec un bloc existant de ton dessin) ((lambda peut être remplacé par un (defun c:macommande, enlever dans ce cas la paranthèse fermante supplémentaire à la fin. Rappel ((lambda est une fonction anonyme qui n'est executé qu'une seule fois lors de son chargement ou appel, elle ne reste pas en mémoire. ((lambda ( / ent vlaobj pt_org pt_end param_start param_end perim_obj x lst_pt x1) (while (not (setq js (ssget "_+.:S" '((0 . "POLYLINE")(-4 . "< NOT")(-4 . "&") (70 . 112)(-4 . "NOT> ")))))) (vl-load-com) (setvar "pdmode" 32) (redraw (setq ent (ssname js 0)) 3) (setq vlaobj (vlax-ename->vla-object ent) pt_org (vlax-curve-getStartPoint vlaobj) pt_end (vlax-curve-getEndPoint vlaobj) param_start (vlax-curve-getStartParam vlaobj) param_end (vlax-curve-getEndParam vlaobj) perim_obj (vlax-curve-getDistAtParam vlaobj param_end) ) (setq x (getdist "\nAbscisse de départ: ")) (setq lst_pt (list (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x)))) (while (< x perim_obj) (setq x1 (+ (/ (* x 2.0) 5.0) x)) (setq lst_pt (cons (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x1)) lst_pt)) (setq x x1) ) (foreach n lst_pt (command "_.point" n)) (redraw ent 4) (prin1) )) NB: Enlever les espace aprés le symbole "> " et "< " [Edité le 18/11/2005 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Concombre_masque Posté(e) le 18 novembre 2005 Auteur Posté(e) le 18 novembre 2005 Wooow... :casstet: Tout d'abord, merci pour vos réponses. Va falloir que j'étudie ca sérieusement parce que là, j'ai rien compris. Je vais relire plusieurs fois :D www.concombre-masque.com
Tramber Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 Moi non plus mais je vais t'aider. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 (defun c:divispe ( / ent vlaobj pt_org pt_end param_start param_end perim_obj x lst_pt x1) (setq js (car(entsel))) (vl-load-com) (setvar "pdmode" 32) ;;; (redraw (setq ent (ssname js 0)) 3) (setq vlaobj (vlax-ename->vla-object js) pt_org (vlax-curve-getStartPoint vlaobj) pt_end (vlax-curve-getEndPoint vlaobj) param_start (vlax-curve-getStartParam vlaobj) param_end (vlax-curve-getEndParam vlaobj) perim_obj (vlax-curve-getDistAtParam vlaobj param_end) ) (setq x (getdist "\nAbscisse de départ: ")) (setq lst_pt (list (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x)))) (while ( (setq x1 (+ (/ (* x 2.0) 5.0) x)) (setq lst_pt (cons (vlax-curve-getPointAtParam vlaobj (vlax-curve-getParamAtDist vlaobj x1)) lst_pt)) (setq x x1) ) (foreach n lst_pt (command "_.point" n)) ;;; (redraw ent 4) (prin1) ) (toutes mes excuses à l'auteur :cool: ) et tape divispe Mais reste un prob, l'orientation dans l'espace ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 remplace (foreach n lst_pt (command "_.point" n))par(foreach n lst_pt (command "inserer" "blo" n 1 1 0)) si tu ne veux pas de points mais un bloc de nom "blo" Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 18 novembre 2005 Posté(e) le 18 novembre 2005 http://img501.imageshack.us/img501/5152/divispe2yn.jpg (defun c:divispe ( / js vlaobj lipoints liang x x1 compt) (setq js (car(entsel))lipoints nil liang nil) (vl-load-com) (setq vlaobj (vlax-ename->vla-object js)) (setq x (getdist "\nAbscisse de départ: ")) (if(vlax-curve-getPointAtDist vlaobj x) (progn (while (vlax-curve-getPointAtDist vlaobj x) (setq x1 (+ (* x 0.4) x)) (setq lipoints (append lipoints(list(vlax-curve-getPointAtDist vlaobj x)))) (setq x x1) ) ) ) (setq compt 0) (repeat (1-(length lipoints)) (setq liang(append liang(list(angle(list(car(nth compt lipoints))(caddr(nth compt lipoints))) (list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints)))))) compt(1+ compt))) (setq compt 0) (repeat (1-(length lipoints)) (command "_insert" "bloc" (nth compt lipoints) 1 1 0 "_rotate3D" (entlast) "" "Y" (nth compt lipoints) (-(* 180(/(nth compt liang) pi)))) (setq compt(1+ compt)) ) (princ) ) Ce code est très limité car il obtiendra la bonne direction si la poly a un Y constant (autrement dit qu'elle est sur un plan XZ). De plus, et c'est IMPORTANT, le calcul de l'angle est fait entre un point et le suivant, alors gaffe ! Avant le virage, le bloc dévie toujours (le deuxi_ème en partant du bas ici, même si ca ne se voit pas. Le troisième est après le virage).[Edité le 18/11/2005 par Tramber] Autre chose :(defun c:divispe ( / js vlaobj lipoints liang x x1 compt)(if (not (member "geom3d.arx" (arx)))(arxload "geom3d"))(setq js (car(entsel))lipoints nil liang nil)........ à la place au début du code permettra de charger _3Drotate qui n'est pas chargé par défaut. [Edité le 18/11/2005 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Concombre_masque Posté(e) le 20 novembre 2005 Auteur Posté(e) le 20 novembre 2005 Comprend pas, chez moi ca ne donne pas du tout le meme resultat. http://concombre.nuxit.net/temp/mur3d2.jpg le premier point que j'ai sélectionné est celui du bas. Le 2è l'extremité haute de la poly. J'ai n'importe quoi en résultat et je comprend rien au code :mad: C'est bête ca semblait bien parti www.concombre-masque.com
Tramber Posté(e) le 20 novembre 2005 Posté(e) le 20 novembre 2005 J'ai (honteusement) repris le GETDIST de Bonuscad !Si tu rentre cette distance, ca ne m'étonne pas que rien ne marche. Tu avais dit 3100. Ne saisi pas la distance qui dépasserait presque Bien sur tu peux saisir au clavier ou à la souris. Au fond de ton image, je vois des objets dans l'espace, tu es sur de tes points d'insertion ? Et puis, mieux vaut ravailler en SCG, au cas où. Et n'oublie pas d'appeler ton bloc "bloc" (ou autre nom + original mais il faut modifier le mot dans le prog). Je ne sais pas ce que tu ne piges pas dans le code mais :(list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints))))))par exemple, sépare X zt Z de chaque point pour reconstituer une paire XY dans laquelle on calcule les angles d'une rotation 3D autour de Y. Autrement dit, on cherche des angles dans un autre plan, par un simple tour de passe-passe ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Concombre_masque Posté(e) le 20 novembre 2005 Auteur Posté(e) le 20 novembre 2005 J'ai (honteusement) repris le GETDIST de Bonuscad !Si tu rentre cette distance, ca ne m'étonne pas que rien ne marche. Tu avais dit 3100. Ne saisi pas la distance qui dépasserait presque Bien sur tu peux saisir au clavier ou à la souris. Hmm, je me suis un peu embrouillé aussi, je vais changer la valeur 0,4 car 3100 c'est de millimètres et le +2 *5 c'est des mètres. Ca je pense pouvoir y arriver comme un grand. OK, je n'avais pas compris ca comme ca, je pensais qu'il fallait entrer le point de depart de la poly et la fin. Au fond de ton image, je vois des objets dans l'espace, tu es sur de tes points d'insertion ? Oui, ce sont les blocs qui ont été collés par le code. Et puis, mieux vaut ravailler en SCG, au cas où. Effectivement, désormais les blocs sont bien sur la polyligne mais pas aux bons endroits. Et n'oublie pas d'appeler ton bloc "bloc" (ou autre nom + original mais il faut modifier le mot dans le prog). Fait, j'ai gardé bloc pour les tests chez moi, je changerais au boulot. Je ne sais pas ce que tu ne piges pas dans le code mais :(list(car(nth(1+ compt)lipoints))(caddr(nth(1+ compt)lipoints))))))par exemple, sépare X zt Z de chaque point pour reconstituer une paire XY dans laquelle on calcule les angles d'une rotation 3D autour de Y. Autrement dit, on cherche des angles dans un autre plan, par un simple tour de passe-passe ! Ouh la la. Bon ca c'est un autre probleme, pour l'instant l'angle n'est pas bon parce qu'il faut que je modifie le bloc de 90° afin qu'il soit dans le bon plan. Ce que je n'ai pas saisi c'est la fonction qui test si il faut ajouter encore un bloc ou pas selon si on est au bout de la poly ou pas. Parce que des fois mes volumes font 5000 mm de haut et des fois ils font 12000 mm donc forcement, il y a plus de points Je vais essayer de paufiner tout ca et je reviens pleurer si j'y arrive pas :) www.concombre-masque.com
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant