Aller au contenu

Messages recommandés

Posté(e)

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 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 ?

 

Amicalement

Vincent

 

 

[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)

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

J'ai schouffé... Ouf, on va dire que c'était une question "philosophique" et que je vais en rester là.

 

Amicalement

Vincent

 

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)

Posté(e)

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

 

Amicalement

Vincent

 

 

[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)

Posté(e)

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

Posté(e)

Merci pour le fil concernant les groupes.

 

Amicalement

Vincent

 

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)

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité