mateus Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Bonjour à tous je recherche une formule sous lisp qui permettrait de projeter un point sur une droite perpendiculairement. Merci d'avance
bryce Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Bonjour, A priori, vlax-curve-getClosestPointTo devrait faire l'affaire. Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
(gile) Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Salut, Regarde la fonction inters dans l'aide. Soit A et B deux points distincts sur la droite et P le point à projeter, la projection (H) de P sur AB est :(setq H (inters A B P (polar P (+ (/ pi 2.0) (angle A B)) 1.0) nil)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 30 juin 2013 Auteur Posté(e) le 30 juin 2013 J'adore ce site ! Merci à vous pour les réponses :)
mateus Posté(e) le 30 juin 2013 Auteur Posté(e) le 30 juin 2013 Gile existe t-il l'aide au développement en Français car avec ma version d'autocad je l'ai uniquement en anglais Merci
mateus Posté(e) le 30 juin 2013 Auteur Posté(e) le 30 juin 2013 (defun c:ESSAI () (setq A(getpoint"\n cliquez sur le premier point : "))(setq B(getpoint"\n cliquez sur le deuxième point : ")) J'ai fait un test sur une droite de type polylign et en ajoutant des espions je me suis rendu compte que le point projeté soit "proj" valait "nil" est-ce normal? Comment puis je faire également pour voir à l'écran mes points ? j'ai déjà été dans "format" "style de points" et choisis des points plus lisibles mais rien y fait :/ (command "polylign" A B "") (setq P(getpoint"\n cliquez sur le premier point d'insertion du candélabre :")) (setq proj (inters A B P (polar P (+ (/ pi 2.0) (angle A B)) 1.0))); A ET B sont les deux points formant la droite // P le point à projeter // proj est le point le projeté ) Merci d'avance :)
(gile) Posté(e) le 30 juin 2013 Posté(e) le 30 juin 2013 Non, l'aide aux développeurs est uniquement en anglais.En français, je peux te proposer "Introduction à AutoLISP" sur cette page. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 30 juin 2013 Auteur Posté(e) le 30 juin 2013 Merci pour ton cours Gile, je le garderai sous la main !
mateus Posté(e) le 1 juillet 2013 Auteur Posté(e) le 1 juillet 2013 Bonjour à tous, Bryce j'ai fait un test avec la fonction vlax-curve-getClosestPointTo, la projection du point se fait bien, par contre lorsque je décide de changer le scu et de mettre en scu local sur la polylign pour tracer un segment perpendiculaire à ma droite, le point projeté, dans mon cas : "projectPoint" sort de ma droite. Est ce normal? Giles comme je l'ai dis dans le post n°6 avec cette méthode, mon point projeté vaut "nil" est ce normal? Merci par avance et bonne journée à vous.
(gile) Posté(e) le 1 juillet 2013 Posté(e) le 1 juillet 2013 J'ai fait un test sur une droite de type polylign et en ajoutant des espions je me suis rendu compte que le point projeté soit "proj" valait "nil" est-ce normal? J'avais oublié de spécifier l'argument 'onSeg' à nil dans la fonction inters, j'ai corrigé.Essaye de ne pas seulement copier/coller les expressions qu'on te donne, mais de les comprendre et de regarder l'aide pour les fonctions que tu ne connais pas. Comment puis je faire également pour voir à l'écran mes points ? j'ai déjà été dans "format" "style de points" et choisis des points plus lisibles mais rien y faitTu sembles confondre les points tels que ceux retournés par des fonctions LISP (getpoint, inters, vlax-curve-getClosestPointTo, ...) qui ne sont que des listes de coordonnées et les entités graphiques point (nodal). j'ai fait un test avec la fonction vlax-curve-getClosestPointTo, la projection du point se fait bien, par contre lorsque je décide de changer le scu et de mettre en scu local sur la polylign pour tracer un segment perpendiculaire à ma droite, le point projeté, dans mon cas : "projectPoint" sort de ma droite. Est ce normal? Attention aux systèmes de coordonnées dans lesquels sont définis les points.D'une manière générale, seuls les points retournés par getpoint ou getcorner sont définis dans le SCU courant. Ceux retournés par les fonction vlax-curve* sont définis dans le SCG.Ceux qu'on trouve dans les listes DXF des entités sont soit définis dans le SCG soit dans le SCO (Système de Coordonnées Objet) pour certaines entités (voir l'aide DXF pour ces entités). Si tu ne travailles qu'en 2d, le SCO est toujours équivalent au SCG.Quand tu crées des entités, si tu utilises la fonction command, les points doivent être définis dans le SCU courant, si tu utilises entmake, les points doivent être définis dans le SCG (ou le SCO), enfin, avec les fonctions vlisp (vla-Add*), les points sont définis dans le SCG (sauf pour les polylignes).Regarde la fonction trans pour convertir les points d'un système de coordonnées vers un autre. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mateus Posté(e) le 2 juillet 2013 Auteur Posté(e) le 2 juillet 2013 Merci pour les infos Giles, j'ai toujours pas compris cet argument "Onseg" du coup j'ai crée une fonction lisp de projection avec une formule mathématique que j'ai trouvé sur le net. Par contre j'ai un soucis quant au résultat du point "projeté orthonormal" . J'ai essayé ensuite de créer un point nodal sur ce point dans mon cas "P" ou bien d'insérer un bloc à ce point et il s'avère que ce fameux point "P" est pas du tout projeté sur la droite. Y a-t'il une erreur dans la formule? Merci d'avance :) et bonne soirée à tous !
mateus Posté(e) le 2 juillet 2013 Auteur Posté(e) le 2 juillet 2013 (defun c:PROJECTION () ;avec ;A= premier point de la droite ;B= deuxième point de la droite ;C= point à projeter sur la droite ;P= projeté orthonormal ;r= paramètre indiquant l'emplacement de P sur la droite ;L= module de la droite AB (setq A (getpoint"\n cliquez sur le premier point ")) (setq xa (car A)) (setq ya (cadr A)) (setq B (getpoint"\n cliquez sur le deuxième point")) (setq xb (car B)) (setq yb (cadr B)) (setq droite (command "polylign" A B "")) (setq C (getpoint"\n cliquez sur le premier candélabre ")) (setq xc (car C)) (setq yc (cadr C)) (setq L (sqrt (+(*(- xb xa) (- xb xa)) (*(- yb ya) (- yb ya))))) (setq r (/(-(*(- ya yc) (- ya yb)) (*(- xa xc) (- xb xa))) (* L L))) (setq PX (*(+ xa r) (- xb xa))); abscisse du projeté orthonormal (setq PY (*(+ ya r) (- yb ya))); ordonné du projeté orthonomal (setq P (list PX PY) ) ) Avec le code c'est mieux <_<
mateus Posté(e) le 2 juillet 2013 Auteur Posté(e) le 2 juillet 2013 Et voici la formule que j'ai choisis : Let the point be C (Cx,Cy) and the line be AB (Ax,Ay) to (Bx,By). The length of the line segment AB is L: L= sqrt( (Bx-Ax)^2 + (By-Ay)^2 ) . Let P be the point of perpendicular projection of C onto AB. Let r be a parameter to indicate P's location along the line containing AB, with the following meaning: r=0 P = A r=1 P = B r<0 P is on the backward extension of AB r>1 P is on the forward extension of AB 0<r<1 P is interior to AB Compute r with this: (Ay-Cy)(Ay-By)-(Ax-Cx)(Bx-Ax) r = ----------------------------- L^2 The point P can then be found: Px = Ax + r(Bx-Ax) Py = Ay + r(By-Ay) And the distance from A to P = r*L.
LrDb Posté(e) le 3 juillet 2013 Posté(e) le 3 juillet 2013 Bonjour,Attention, je n'y connais que dalle en lisp.mais sur tes calculs de PX et PY,j'ai l'impression que tu fais ceci:(Ax+r)*(Bx-Ax)ce qui n'a rien à voiravec Ax+r*(Bx-Ax)priorité à la multiplication, c'est bien connu..Cordialement,LrDb Write a book about what ??
mateus Posté(e) le 3 juillet 2013 Auteur Posté(e) le 3 juillet 2013 Exactement, erreur d'étourderie... Merci de me l'avoir fait remarqué je vais corriger cela. Merci beaucoup
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