Clément.a Posté(e) le 5 septembre 2013 Posté(e) le 5 septembre 2013 Bonjour, C'est surement très simple mais je suis à cours d'idée!!J'aimerais que mon programme trace le premier point du polyligne, fixe l'angle de la droite et à l'utilisateur de cliquer ou il souhaite le deuxième point de la polyligne mais situer sur la doite. comme cela : (defun c:hh () (command "polylign" '(0 0 0) (getpoint "\cliquez") "" ) ) Sauf que l'angle est bloqué. merci
didier Posté(e) le 5 septembre 2013 Posté(e) le 5 septembre 2013 coucou c'est sans doute très simple ...sauf que je ne comprends pas...tu pars du point 0,0,0 c'est normal ou bien tu veux partir d'un point cliqué par l'utilisateur, (c'est rare de partir du zéro)ensuite tu dis que l'angle est bloqué, soit !mais quel angle ? merci de ton complément d'information pour t'aider efficacement. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
-Olivier- Posté(e) le 6 septembre 2013 Posté(e) le 6 septembre 2013 Salut,Je suppose que Clément souhaite un comportement similaire aux commandes suivantes :Commande: _pline Spécifiez le point de départ: 0,0,0 La largeur courante est de 0.0000. Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20 Remplacer angle: 20.00 Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: Je n'arrive pas à obtenir ce résultat en programmation mais je suis intéressé par la réponse.Pour le point 0,0,0 je suppose c'est un exemple le but étant de partir d'un point donné par le programme ? Espérant avoir aidé.Olivier
Clément.a Posté(e) le 6 septembre 2013 Auteur Posté(e) le 6 septembre 2013 Bonjour à tous, C'est exactement ce que je veux faire -Olivier- et le point 0,0,0 est un exemple le but est bien de partir d'un point donné par le programme. en passant je connaissait pas ça :Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20 Voila si quelqu'un c'est comment y parvenir?
fredbross Posté(e) le 6 septembre 2013 Posté(e) le 6 septembre 2013 Bonjour, pourquoi ne pas simplement placer le scu au point voulu, avec l'angle voulu, puis (command "polylign" '(0 0 0) pause "" )
Tramber Posté(e) le 6 septembre 2013 Posté(e) le 6 septembre 2013 Il conviendra de clarifier la distance au point de départ que tu veux, si c'est une projection ou la distance de l'élastique.Ensuite, ça n'est que du calcul de point. Il y a aussi l'interaction autolisp pour la création de la poly. Un (tellement) vieux sujet !Voir la réponse du (tellement) grand Didier. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Clément.a Posté(e) le 6 septembre 2013 Auteur Posté(e) le 6 septembre 2013 je vois pas ou tu veux en venir fredboss.Je me réexplique car je l'impression que vous m'avez pas très bien suivit. j'aimerais que le programme fasse ça tout seul :Commande: _pline Spécifiez le point de départ: 0,0,0 La largeur courante est de 0.0000. Spécifiez le point suivant ou [Arc/Demi-larg/LOngueur/annUler/LArgeur]: <20 Remplacer angle: 20.00 et ensuite à l'utilisateur de cliquez le deuxième point bloqué sur la droite à 20°.Le point 0,0,0 et l'angle 20° sont pour l'exemple ces deux valeurs seront des variables calculé prélablement par le programme.
Clément.a Posté(e) le 6 septembre 2013 Auteur Posté(e) le 6 septembre 2013 j'avais pas vu ta réponse Tramber.
Clément.a Posté(e) le 6 septembre 2013 Auteur Posté(e) le 6 septembre 2013 J'ai pas trouver ce que je voulais dans ta réponse Tramber.Je veux pas que l'utilisateur entre une distnace mais bien un point se situant sur la droite élastique former par le premier point et l'angle;
fredbross Posté(e) le 6 septembre 2013 Posté(e) le 6 septembre 2013 J'avais oublier de préciser qu'il fallait aussi activer le mode ortho.pourquoi ne pas simplement placer le scu au point voulu, avec l'angle voulu, puis (command "polylign" '(0 0 0) pause "" ) ce qui fera exactement ce que tu veux.
Clément.a Posté(e) le 6 septembre 2013 Auteur Posté(e) le 6 septembre 2013 Oui mais l'utilisateur pourra aussi cliqué à +90° et même si dans le contexte sa ne serai pas logique du tout je préfere pas prendre le risque! Parfois les utilisateur font des truc bizzard :unsure:
bonuscad Posté(e) le 6 septembre 2013 Posté(e) le 6 septembre 2013 Bonjour, C'est un truc comme cela que tu voudrais? ((lambda ( / po ang d) (setq po (getpoint "\nPoint de départ: ")) (setq ang (getangle po "\nOrientation de la polyligne: ")) (command "_.pline" po "_width" 0.0 0.0) (while (setq d (getdist (getvar "LASTPOINT") "\nDistance: ")) (command (polar (getvar "LASTPOINT") ang d)) ) (command "") )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Tramber Posté(e) le 8 septembre 2013 Posté(e) le 8 septembre 2013 Il faut construite ton point avec POLAR. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Clément.a Posté(e) le 9 septembre 2013 Auteur Posté(e) le 9 septembre 2013 Bonjour à tous! Merci pour toute vos propositions mais c'est pas ce que je souhaitais, je pense que ça doit pas etre faisable!
(gile) Posté(e) le 9 septembre 2013 Posté(e) le 9 septembre 2013 Salut, Je pense que ce que tu cherches à faire est possible avec la fonction grread. Un exemple avec une fonction qui utilise grread pour dessiner une ligne à partir d'un point et d'un vecteur directeur que j'avais écrite pour d'autres besoins.L'utilisateur est invité à spécifier la distance depuis le point de départ au clavier ou avec le curseur.L'exemple n'est peut-être pas très simple à comprendre parce que la fonction est définie pour être utilisée quel que soient le SCU courant et la vue courante (3d). ;; gc:grDrawLine (gile) ;; Utilisation de grread pour dessiner une ligne à partir d'un point et ;; d'un vecteur directeur ;; ;; Arguments ;; startPt : point de départ de la ligne (coordonnées SCG) ;; direction : vecteur directeur de la ligne (coordonnées SCG) (defun gc:grDrawLine (startPt direction / dist pt ratio line elst loop) (if (/= 0 (setq dist (distance (gc:UCSProjectAboutView '(0 0 0)) (gc:UCSProjectAboutView direction) ) ) ) (progn (setq ;; projection du point sur le plan du SCU pt (trans (gc:UCSProjectAboutView startPt) 0 1) ;; rapport entre la longueur du vecteur et celle de sa projection sur le SCU ratio (/ 1 dist) ;; ligne de longueur 0 line (entmakex (list '(0 . "LINE") (cons 10 startPt) (cons 11 startPt) ) ) elst (entget line) loop T ) (princ "\nSpécifiez la longueur ou [annUler]: ") (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda (/ gr len end str) (while (and (setq gr (grread T 12 0)) (/= (car gr) 3) loop) (cond ;; modification de la ligne en fonction de la position du pointeur ((= 5 (car gr)) (if (minusp (gc:DotProduct (gc:3dTo2dPoint (trans direction 0 2 T)) (gc:3dTo2dPoint (trans (mapcar '- (cadr gr) pt) 1 2 T)) ) ) (setq direction (mapcar '- direction)) ) (setq len (* ratio (distance pt (cadr gr))) end (mapcar (function (lambda (x1 x2) (+ x1 (* len x2)) ) ) startPt direction ) ) (entmod (subst (cons 11 end) (assoc 11 elst) elst ) ) ;; affichage dynamique de la longueur dans la barre d'état (grtext -1 (rtos len)) ) ;; clic droit ((member (car gr) '(11 25)) (entdel line) (setq loop nil line nil ) ) ;; Entrée ou Espace ((member (cadr gr) '(13 32)) (cond ;; longueur valide ((and str (numberp (distof str))) (setq end (mapcar (function (lambda (x1 x2) (+ x1 (* (distof str) x2)) ) ) startPt direction ) loop nil ) (entmod (subst (cons 11 end) (assoc 11 elst) elst ) ) ) ;; annUler ((= (strcase str) "U") (entdel line) (setq loop nil line nil ) ) ;; entrée non valide (T (princ "\nNécessite un nombre valide ou une saisie au pointeur. \nSpécifiez la longueur ou [annUler]: " ) (setq str "") ) ) ) ;; Récupération des entrée au clavier (T ;; retour/effacer (if (= (cadr gr) 8) (or (and str (/= str "") (setq str (substr str 1 (1- (strlen str)))) (princ (chr 8)) (princ (chr 32)) ) (setq str nil) ) (or (and str (setq str (strcat str (chr (cadr gr)))) ) (setq str (chr (cadr gr))) ) ) ;; affichage sur la ligne commande (and str (princ (chr (cadr gr)))) ) ) ) ) ) ) (and (entdel line) (setq line nil)) ) ) (princ "\nLa direction est perpendiculaire à la vue") ) (grtext) line ) ;;====================================================================;; ;;gc:3dTo2dPoint ;; Retourne le point 2d (x y) ;; ;; Argument: un point 3d (x y z) (defun gc:3dTo2dPoint (p) (list (car p) (cadr p))) ;;====================================================================;; ;;gc:DotProduct Retourne le produit scalaire (réel) de deux vecteurs (defun gc:DotProduct (v1 v2) (apply '+ (mapcar '* v1 v2)) ) ;;====================================================================;; ;;; gc:Normalize Retourne le vecteur unitaire d'un vecteur (defun gc:Normalize (v) ((lambda (l) (if (/= 0 l) (mapcar (function (lambda (x) (/ x l))) v) ) ) (distance '(0 0 0) v) ) ) ;;====================================================================;; ;;; gc:IntersLinePlane Retourne le point d'intersection de la droite définie par p1 p2 ;;; et du plan défini par un point et sa normale. (defun gc:IntersLinePlane (p1 p2 org nor / scl) (if (and (/= 0 (setq scl (gc:DotProduct nor (mapcar '- p2 p1)))) (setq scl (/ (gc:DotProduct nor (mapcar '- p1 org)) scl)) ) (mapcar (function (lambda (x1 x2) (+ (* scl (- x1 x2)) x1))) p1 p2 ) ) ) ;;====================================================================;; ;; gc:UCSProjectAboutView ;; Projette un point sur le plan du SCU courant suivant la vue courante ;; ;; Argument ;; pt : le point à projeter (coordonneés SCG) ;; ;; Retour : le point sur le plan du SCU courant (coordonneés SCG) (defun gc:UCSProjectAboutView (pt) (gc:IntersLinePlane pt ((lambda (p) (trans (list (car p) (cadr p) (1+ (caddr p))) 2 0 ) ) (trans pt 0 2) ) (trans '(0 0 0) 1 0) (trans '(0 0 1) 1 0 T) ) ) Exemple d'utilisation, l'utilisateur spécifie le premier point, puis pour le second, on utilise gc:grDrawLine avec le point spécifié traduit dans le SCG et un angle de 20° (en fait 20 unités angulaire courante) dans le SCU courant. Comme gc:grDrawLine requiert un vecteur directeur dans le SCG, on calcule le vecteur à partir de l'angle (ici "20") et on le convertit dans le SCG.Puis on lance la commande POLYLIGN avec les deux premiers points. (defun c:hh (/ pt0 line) (if (and (setq pt0 (getpoint "\nSpécifiez le point de départ: ")) (setq line (gc:grDrawLine (trans pt0 1 0) (trans (list (cos (angtof "20")) (sin (angtof "20")) 0.0) 1 0 T) ) ) ) (progn (entdel line) (command "_.pline" pt0 (trans (cdr (assoc 11 (entget line))) 0 1)) ) ) (princ) ) Il est possible de modifier gc:grDrawLine pour qu'elle fonctionne avec un point et un angle et qu'elle retourne le second point plutôt qu'une ligne. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Clément.a Posté(e) le 10 septembre 2013 Auteur Posté(e) le 10 septembre 2013 C'est parfait, j'ai le résultat que j'attendais. Merci pour ce code.
(gile) Posté(e) le 10 septembre 2013 Posté(e) le 10 septembre 2013 Re, Un exemple un peu plus simple puisqu'on ne travaille qu'en 2d dans le SCU courant. ;; gc:GetPolarPoint (gile) ;; Invite l'utilisateur à saisir un point ;; Retourne le point dans le SCU courant ;; ;; Arguments ;; startPoint : point de départ dans le SCU courant ;; direction : angle depuis l'axe X du SCU courant exprimé dans l'unité angulaire courante ;; message : message d'invite (defun gc:GetPolarPoint (startPoint direction message / *error* dirVec gr loop len endPoint str) (defun *error* (msg) (and msg (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (grtext) (redraw) ) (princ message) (setq direction (angtof (rtos direction 2 16)) dirVec (list (cos direction) (sin direction) 0.0) loop T ) (while (and (setq gr (grread T 12 0)) (/= (car gr) 3) loop) (cond ;; modification de la ligne en fonction de la position du pointeur ((= 5 (car gr)) (if (minusp (gc:DotProduct dirVec (mapcar '- (cadr gr) startPoint))) (setq dirVec (mapcar '- dirVec)) ) (setq len (distance startPoint (cadr gr)) endPoint (mapcar (function (lambda (x1 x2) (+ x1 (* len x2)) ) ) startPoint dirVec ) ) (redraw) (grdraw startPoint endPoint -1) ;; affichage dynamique de la longueur dans la barre d'état (grtext -1 (rtos len)) ) ;; clic droit ((member (car gr) '(11 25)) (redraw) (setq loop nil) ) ;; Entrée ou Espace ((member (cadr gr) '(13 32)) (cond ;; longueur valide ((and str (numberp (distof str))) (setq endPoint (mapcar (function (lambda (x1 x2) (+ x1 (* (distof str) x2)) ) ) startPoint dirVec ) loop nil ) ) ;; annUler ((= (strcase str) "U") (redraw) (setq loop nil) ) ;; entrée non valide (T (princ "\nNécessite un nombre valide ou une saisie au pointeur. \nSpécifiez la longueur ou [annUler]: " ) (setq str "") ) ) ) ;; Récupération des entrée au clavier (T ;; retour/effacer (if (= (cadr gr) 8) (or (and str (/= str "") (setq str (substr str 1 (1- (strlen str)))) (princ (chr 8)) (princ (chr 32)) ) (setq str nil) ) (or (and str (setq str (strcat str (chr (cadr gr)))) ) (setq str (chr (cadr gr))) ) ) ;; affichage sur la ligne commande (and str (princ (chr (cadr gr)))) ) ) ) (*error* nil) endPoint ) ;;====================================================================;; ;;gc:DotProduct Retourne le produit scalaire (réel) de deux vecteurs (defun gc:DotProduct (v1 v2) (apply '+ (mapcar '* v1 v2)) ) Exemple d'utilisation : (defun c:hh (/ p0 p1) (if (and (setq p0 (getpoint "\nSpécifiez le point de départ: ")) (setq p1 (gc:GetPolarPoint p0 20 "\nSpécifiez le point suivant: ")) ) (command "_.pline" p0 p1) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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