zebulon_ Posté(e) le 8 décembre 2008 Posté(e) le 8 décembre 2008 Bonjour, ce sujet pour, d'une part, exprimer tout le bien que je pense des fonctions vlax-curve et, d'autre part revenir sur vlax-curve-getfirstderiv en particulier.On a déjà parlé de cette fonction ici et là et surement ailleurs, mais je dois avouer que les exemples donnés étaient trop compliqués pour moi et j'aimerais vous proposer quelque chose de plus simple. L'idée, c'est de partir d'un chemin (polyligne ou autre ...), de donner un pas (PAS) et un décalage (D). L'objectif est de tracer des perpendiculaires de longueur 2xD le long du chemin à chaque PAS. http://img368.imageshack.us/img368/9885/perpchemts1.jpg (defun cs:line (PO PF / AcDoc Space) (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (vla-addLine Space (vlax-3d-point PO) (vlax-3d-point PF) ) ) (defun c:perpchem () ;; saisir les éléments de construction (setq CHEM (vlax-ename->vla-object (car (entsel "\nChemin : ")))) (setq D (getdist "\nDécalage : ")) (setq PAS (getdist "\nPas : ")) ;; calculer la longueur du chemin (setq LCHEM (vlax-curve-getDistAtPoint CHEM (vlax-curve-getEndPoint CHEM))) (setq PK 0) (while (< PK LCHEM) ;; déterminer le paramètre au pk courant (setq PM (vlax-curve-getParamAtDist CHEM PK)) ;; déterminer le point au pk courant (setq PT (vlax-curve-getPointAtDist CHEM PK)) ;; déterminer la dérivée première (setq FDER (vlax-curve-getfirstderiv CHEM PM)) ;; déterminer le point qui construit la tangente à la courbe au point PT (setq PTDERIV (mapcar '+ PT FDER)) ;; déterminer les points perpendiculaires à PT à une distance D (setq PTG (polar PT (+ (angle PT PTDERIV) (/ pi 2)) D)) (setq PTD (polar PT (- (angle PT PTDERIV) (/ pi 2)) D)) ;; tracer la ligne (cs:line PTD PTG) ;; passer au pk suivant (setq PK (+ PK PAS)) ) (princ) ) Mon problème était que la fonction vlax-curve-getfirstderiv renvoie un vecteur, dont je ne savais pas trop quoi faire. Finalement, j'ai fait une bête addition et ça a l'air de marcher. L'autre question "philosophique" que je me pose au sujet des fonctions vlax-curve est la nature du paramètre param qui est renvoyé ou demandé par certaines de ces fonctions. C'est quoi, au juste, ce param ? AmicalementVincent [Edité le 8/12/2008 par 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)
Tramber Posté(e) le 8 décembre 2008 Posté(e) le 8 décembre 2008 L'autre question "philosophique" que je me pose au sujet des fonctions vlax-curve est la nature du paramètre param qui est renvoyé ou demandé par certaines de ces fonctions. C'est quoi, au juste, ce param ? Schouff ici. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
zebulon_ Posté(e) le 8 décembre 2008 Auteur Posté(e) le 8 décembre 2008 J'ai schouffé... Ouf, on va dire que c'était une question "philosophique" et que je vais en rester là. AmicalementVincent 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)
zebulon_ Posté(e) le 8 décembre 2008 Auteur Posté(e) le 8 décembre 2008 En poussant un peu tout cela et, sans se forcer à écrire 15 pages de code, on peut faire une petite routine qui dessine des barbules de talus. (defun cs:line (PO PF / AcDoc Space) (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (vla-addLine Space (vlax-3d-point PO) (vlax-3d-point PF) ) ) (defun cs:xline (BASEPOINT DIRVEC / AcDoc Space) (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (vla-addxLine Space (vlax-3d-point BASEPOINT) (vlax-3d-point DIRVEC) ) ) (defun coord->list (L / RES I) (setq I 0) (repeat (/ (length L) 3) (setq RES (cons (list (nth I L) (nth (+ I 1) L) (nth (+ I 2) L)) RES)) (setq I (+ I 3)) ) (reverse RES) ) (defun nearestpt (L PT / LMIN E TMP RES) (while L (setq E (car L)) (setq L (cdr L)) (setq TMP (distance E PT)) (if (or (not LMIN) (< TMP LMIN)) (progn (setq LMIN TMP) (setq RES E) ) ) ) RES ) ;;; créer un groupe avec les adresses d'éléments contenus dans LST ;;; (defun makegrp (LST DESC / EN) (command "_.-group" "_create" "*" DESC) (foreach EN LST (command EN)) (command "") ) (defun c:talus (/ AcDoc CHEM CHEMB PAS NB RAP LCHEM PK IB PM PT FDER PTDERIV PTG XLINE LPTB LN LGR) (setvar "CMDECHO" 0) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-StartUndoMark AcDoc) ;; saisir les éléments de construction (setq CHEM (vlax-ename->vla-object (car (entsel "\nHaut talus : ")))) (setq CHEMB (vlax-ename->vla-object (car (entsel "\nBas talus : ")))) (setq PAS (getdist "\nPas : ")) (setq NB (getint "\nNombre de petits traits : ")) (setq RAP (getdist "\nRapport longueur petit trait / grand trait : ")) ;; calculer la longueur du chemin (setq LCHEM (vlax-curve-getDistAtPoint CHEM (vlax-curve-getEndPoint CHEM))) (setq PK 0) (setq IB 0) (while (< PK LCHEM) ;; déterminer le paramètre au pk courant (setq PM (vlax-curve-getParamAtDist CHEM PK)) ;; déterminer le point au pk courant (setq PT (vlax-curve-getPointAtDist CHEM PK)) ;; déterminer la dérivée première (setq FDER (vlax-curve-getfirstderiv CHEM PM)) ;; déterminer le point qui construit la tangente à la courbe au point PT (setq PTDERIV (mapcar '+ PT FDER)) ;; déterminer un point perpendiculaire à PT à une distance 1.00 (setq PTG (polar PT (+ (angle PT PTDERIV) (/ pi 2)) 1.00)) ;; tracer la xline (setq xline (cs:xline PT PTG)) (setq LPTB (coord->list (vlax-invoke xline 'IntersectWith CHEMB acExtendNone))) ;; ne prendre qu'un seul point, le plus proche (if (setq PTB (nearestpt LPTB PT)) (progn ;; tracer la ligne (if (= IB 0) (setq LN (cs:line PT PTB)) (setq LN (cs:line PT (polar PT (angle PT PTB) (* RAP (distance PT PTB))))) ) ;; rajouter à la liste de groupe (setq LGR (cons (vlax-vla-object->ename LN) LGR)) ) ) (setq IB (+ IB 1)) (if (= IB NB) (setq IB 0) ) (vla-delete xline) ;; passer au pk suivant (setq PK (+ PK PAS)) ) (makegrp LGR "Talus") (vla-endundomark AcDoc) (princ) ) Faut encore que je trouve comment créer des groupes sans utiliser command AmicalementVincent [Edité le 8/12/2008 par 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)
(gile) Posté(e) le 8 décembre 2008 Posté(e) le 8 décembre 2008 Salut Faut encore que je trouve comment créer des groupes sans utiliser command Tu peux t'inspirer de ça Pour le Param des CurveObjects, je pense que les plus utiles sont :EndParam qui permet d'avoir le périmètre de n'importe quelle courbe ouverte ou fermée.Et les params des polylignes (tous types) qui sont des entiers à chaque sommet. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 9 décembre 2008 Auteur Posté(e) le 9 décembre 2008 Merci pour le fil concernant les groupes. AmicalementVincent 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)
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