Azerty Posté(e) le 19 janvier 2007 Posté(e) le 19 janvier 2007 Bonjour à tous, Ce sujet a surement déjà été abordé sur le forum ...Mais ne connaissant pas la commande correspondante, je ne trouve pas mon bonheur.Merci de m'aiguiller, et désolé pour l'éventuel doublon. J'ai une polyligne 3D. (= plusieurs points ayant des altitudes différentes)Ce sont mes "points hauts". Je voudrais pouvoir "extruder" cette P3D dans une direction, en fonction d'un angle précis.La finalité, c'est de connaitre l'altitude de mes points bas. Exemple, je décide que ma pente est de 1,5%Je connais donc les angles de mon "talus" : 0,86° // 89°(c'est pas pour un talus, mais c'est plus facile à expliquer) En faisant une extrusion, un maillage, ou n'importe quoi en 3D de ma polyligne, je modéliserais automatiquement cette fameuse pente de 1,5%La finalité, c'est que pour un endroit donné sur le plan, j'aurais l'intersection : pente modélisée / mur vertical.Et donc une altimétrie "projet". (dans l'exemple, la "hauteur" d'un mur de soutènement) Donc ma question est : est-ce possible avec AutoCAD ?Pour l'instant, je fais ça "a la main", en calculant la hauteur (merci la trigonométrie ...)Puis je créé des points aux bons endroits, à la bonne altitude que je relies ensuite ... Une seule chose à dire : MERCI CADxp !
didier Posté(e) le 19 janvier 2007 Posté(e) le 19 janvier 2007 hello, Sujet intéressant à travailler :) Donc si je résume ce que j'ai compris,on va chercher la projection d'une polyligne 3Dsuivant une pente donnéesur une 3dFace, verticale ou pas. Le but est de créer une nouvelle polylignequi sera justement l'ensemble des ces points d'intersection. De mon côté j'ai déjà une création de ligne suivant une pente donnéemais je n'ai pas travaillé sur les intersectionscar j'ai un module, en l'occurence Covadis,qui le fait pas trop mal (sauf faces purement verticales) Je vais tenter de me libérer du temps pour penser à ton souci,car il est intéressant. il y a un décal3D qui existe quelque part sur le site,je me souviens avoir lu quelque chose fais une recherche.. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 19 janvier 2007 Posté(e) le 19 janvier 2007 Salut, Je ne suis pas sûr de bien comprendre la demande, mais je propose un LISP qui crée une polyligne 3D (plane) qui est la projection de la polyligne 3D sélectionnée sur le plan défini par 3 points. EDIT : Je précise qu'il s'agit de la projection verticale de la polyligne 3D, puisqu'il est question d'altitude.j'ajoute un contrôle pour éviter une erreur si le plan spécifié est vertical. ;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points ;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0)) (defun 3d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (3d-coord->pt-lst (cdddr lst)) ) ) ) ;;; NORM_3PTS retourne le vecteur normal du plan défini par 3 points (defun norm_3pts (org xdir ydir / norm) (foreach v '(xdir ydir) (set v (mapcar '- (eval v) org)) ) (if (inters org xdir org ydir) (mapcar '(lambda (x) (/ x (distance '(0 0 0) norm))) (setq norm (list (- (* (cadr xdir) (caddr ydir)) (* (caddr xdir) (cadr ydir)) ) (- (* (caddr xdir) (car ydir)) (* (car xdir) (caddr ydir)) ) (- (* (car xdir) (cadr ydir)) (* (cadr xdir) (car ydir)) ) ) ) ) ) ) ;;; Proj3dPoly Crée une polyligne 3d (plane), projection verticale ;;; de la polyligne 3d sélectionnée sur le plan spécifié par 3 points (defun c:proj3Dpoly (/ poly1 poly2 pt1 pt2 pt3 3Dpts 2Dpts plst) (vl-load-com) (if (not (member "geomcal.arx" (arx))) (arxload "geomcal") ) (prompt "\nSélectionnez la polyligne 3D: ") (if (setq poly1 (ssget "_:S:E" '((0 . "POLYLINE") (-4 . "&") (70 . 8)))) (progn (initget 1) (setq pt1 (trans (getpoint "\nSpécifiez le premier point du plan de coupe: " ) 1 0 ) pt2 pt1 pt3 pt1 ) (while (equal pt1 pt2 1e-9) (setq pt2 (trans (getpoint "\nSpécifiez le deuxième point: ") 1 0) ) ) (while (or (equal pt3 pt1 1e-9) (equal pt3 pt2 1e-9) (null (inters pt3 pt1 pt3 pt2)) ) (setq pt3 (trans (getpoint "\nSpécifiez le troisième point: ") 1 0) ) ) (if (equal (caddr (norm_3pts pt1 pt2 pt3)) 0.0 1e-9) (prompt "\nPlan de projection vertical.") (progn (setq poly1 (vlax-ename->vla-object (ssname poly1 0)) 3Dpts (3d-coord->pt-lst (vlax-get poly1 'Coordinates)) 2Dpts (mapcar '(lambda (p) (list (car p) (cadr p) 0.0)) 3Dpts ) plst (mapcar '(lambda (p1 p2) (cal "ilp(p1,p2,pt1,pt2,pt3)")) 3Dpts 2Dpts ) poly2 (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) 'add3dPoly (apply 'append plst) ) ) (if (= (vla-get-Closed poly1) :vlax-true) (vla-put-Closed poly2 :vlax-true) ) ) ) ) ) (princ) ) [Edité le 19/1/2007 par (gile)] [Edité le 20/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 19 janvier 2007 Posté(e) le 19 janvier 2007 Le LISP ci-dessus utilise la calculatrice gémétrique d'AutoCAD (CAL), il est possible de faire la même chose avec des petites routine de calcul vectoriels et angulaire publiées dans ce sujet.Si le code est un peu plus long, le calcul des points semble être 4 fois plus rapide. Si ceci ne répond pas à la demande, ces routines devraient pouvoir servir pour le modifier. ;;; ILP 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 ilp (p1 p2 org norm) (inters p1 p2 (proj_pt p1 org norm) (proj_pt p2 org norm) nil ) ) ;;; PROJ_PT Retourne les coordonnées de la projection orthogonale ;;; du point pt sur le plan défini par un point et sa normale. (defun proj_pt (pt org norm) (mapcar '- pt (mapcar '(lambda (x) (* x (cos (angle_3pts org (mapcar '+ org norm) pt)) (distance org pt) ) ) norm ) ) ) ;;; NORM_3PTS retourne le vecteur normal du plan défini par 3 points (defun norm_3pts (org xdir ydir / norm) (foreach v '(xdir ydir) (set v (mapcar '- (eval v) org)) ) (if (inters org xdir org ydir) (mapcar '(lambda (x) (/ x (distance '(0 0 0) norm))) (setq norm (list (- (* (cadr xdir) (caddr ydir)) (* (caddr xdir) (cadr ydir)) ) (- (* (caddr xdir) (car ydir)) (* (car xdir) (caddr ydir)) ) (- (* (car xdir) (cadr ydir)) (* (cadr xdir) (car ydir)) ) ) ) ) ) ) ;;; ANGLE_3PTS Retourne l'angle (radians) défini par son sommet et deux points ;;; L'angle retourné est toujours positif et inférieur à pi radians. (defun angle_3pts (som p1 p2 / d1 d2 d3) (setq d1 (distance som p1) d2 (distance som p2) d3 (distance p1 p2) ) (if (and ( (ACOS (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3))) (* 2 d1 d2) ) ) ) ) ;;; ACOS Retourne l'arc cosinus du nombre, en radians (defun ACOS (num) (cond ((equal num 1 1e-9) 0.0) ((equal num -1 1e-9) pi) (( (atan (sqrt (- 1 (expt num 2))) num) ) ) ) ;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points ;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0)) (defun 3d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (3d-coord->pt-lst (cdddr lst)) ) ) ) ;;; Proj3dPoly Crée une polyligne 3d (plane), projection verticale ;;; de la polyligne 3d sélectionnée sur le plan spécifié par 3 points (defun c:proj3Dpoly (/ poly1 poly2 pt1 pt2 pt3 norm 3Dpts 2Dpts plst) (vl-load-com) (prompt "\nSélectionnez la polyligne 3D: ") (if (setq poly1 (ssget "_:S:E" '((0 . "POLYLINE") (-4 . "&") (70 . 8)))) (progn (initget 1) (setq pt1 (trans (getpoint "\nSpécifiez le premier point du plan de projection: " ) 1 0 ) pt2 pt1 pt3 pt1 ) (while (equal pt1 pt2 1e-9) (setq pt2 (trans (getpoint "\nSpécifiez le deuxième point: ") 1 0) ) ) (while (or (equal pt3 pt1 1e-9) (equal pt3 pt2 1e-9) (null (inters pt3 pt1 pt3 pt2)) ) (setq pt3 (trans (getpoint "\nSpécifiez le troisième point: ") 1 0) ) ) (setq norm (norm_3pts pt1 pt2 pt3)) (if (equal (caddr norm) 0.0 1e-9) (prompt "\nPlan de projection vertical.") (progn (setq poly1 (vlax-ename->vla-object (ssname poly1 0))) (setq 3Dpts (3d-coord->pt-lst (vlax-get poly1 'Coordinates))) (setq 2Dpts (mapcar '(lambda (p) (list (car p) (cadr p) (1+ (caddr p)))) 3Dpts )) (setq plst (mapcar '(lambda (p1 p2) (ilp p1 p2 pt1 norm)) 3Dpts 2Dpts )) (setq poly2 (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) 'add3dPoly (apply 'append plst) ) ) (if (= (vla-get-Closed poly1) :vlax-true) (vla-put-Closed poly2 :vlax-true) ) ) ) ) ) (princ) )[Edité le 20/1/2007 par (gile)] [Edité le 22/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 22 janvier 2007 Auteur Posté(e) le 22 janvier 2007 Merci de vos réponses.Je vais essayer d'être plus clair, car un outil qui me faciliterait la vie serait vraiment le bienvenue ...J'ai mis en ligne une image : http://www.megaupload.com/fr/?d=QJTJ95X4Dans cet exemple, je connais les altimétries du bâti, le filaire projet, et la pente projet.L'objectif c'est d'aller le plus vite possible pour connaitre l'altimétrie des "points rouges". (désolé d'utiliser megaupload, mais ça sera, je pense, beaucoup plus explicite avec une image ...) D'après moi il y a différentes possibilités. • Posséder un logiciel dédié ... (fait en qq sec sous Covadis, je suppose ...) • Décaler la polyligne3D de 3m, dans la pente des 4%. Monter à la verticale le filaire projet et se baser sur leur intersection.Mais je n'arrive pas à "décaler" une p3D ... • Par le dessin : je reporte la distance (~ cercle) pointnoir//pointrouge sur une pente de 4% (~ligne).Je relie le point.d'intersection à une ligne.altitude.zéroJ'utilise les champs pour "écrire" l'altitude (correspondant à la longueur de ma polyligne)Je créé les points, je les relie. • Par des calculs trigonométriques, excel + coté adjacent + ect. ect.J'obtient les altitudes projet. Mais c'est ch**** car il faut là aussi mesurer les distances.De plus, un grand nombre de points, c'est source d'erreurs ... D'avance, merci.Cordialement. Une seule chose à dire : MERCI CADxp !
didier Posté(e) le 22 janvier 2007 Posté(e) le 22 janvier 2007 Coucou Clique là dessus : LIEN ce sera plus simple pour voir ton imagecar le lien que tu donnes, ne me permet pas de la voir... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 22 janvier 2007 Posté(e) le 22 janvier 2007 Salut, Je peux me tromper, je ne suis pas "de la partie", mais il me semble que le LISP donné ci-dessus pourrait servir. Sur l'image ci dessous, la polyligne 3D rouge est la projection verticale du "filaire projet" (bleu) sur le plan défini par les points A, B et C, soit la pente le long du bâti et les 20% (j'ai augmenté pour plus de lisibilité) menés perpendiculairement à celui-ci. Le LISP crée automatiquement la polyligne 3D (rouge) après sélection de la polyligne 3D (bleue) et spécification des 3 points A, B et C définissant le plan de projection. http://xs511.xs.to/xs511/07041/Proj3dpoly.png Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 23 janvier 2007 Auteur Posté(e) le 23 janvier 2007 Un grand merci à vous deux, pour vous pencher sur mon problème. @ Didier :Avec imageshack ... si toi aussi, tu veux te creuser la tête ...http://img441.imageshack.us/img441/6065/pentetotocad4og.jpg @ (Gile)Avec l'image, je comprends mieux.J'utilisais un mauvais plan de coupe : B.A.C et non ABC ... Le 1er (petit) souci, c'est de devoir partir au sol d'une polyligne 3D. Mais bon, la conversion p3d »»» polyligne doit bien exister. Non en fait, le principal problème (enfin je crois, j'utilise peut être mal le lisp ...) concerne la projection verticale.En effet, je pense que cette méthode fonctionne pour chaque segment, mais pas pour l'ensemble des points.La projection se fait sur le plan BC, donc ça fonctionne (on trouve une intersection au niveau de B et au niveau de C) mais pour les points intermédiaires, ça ne fonctionne pas forcement.Le problème de ces points, c'est qu'ils ne se situent pas forcement sur la droite BC. Voilà pourquoi depuis le début, je parle d' "extrusion".Dans le sens ou si on pouvait extruder dans la direction de la pente le "pied de bâti" sur 10m, ça règlerait le problème.(trottoirs de 10m + filaire projet sur 200m de haut = intersections = points dont j'ai besoin.) Cordialement. Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 Salut, Je me doutais bien ne pas avoir "tout juste".Tu n'utilises pas mal le LISP, il s'agit bien d'un plan, donc BC est une droite. Par contre il est curieux que BAC ne donne pas les mêmes résultats que ABC ! Je peux essayer de faire autre chose, pourrais tu préciser : - le type d'entité du filaire projet (polyligne si j'ai bien compris ?)- le plan dans lequel il est est (toujours XY du SCG ou parfois XY d'un SCU avec une élévation ?)- les points altimétriques connus sont ils les sommets d'une entité (polyligne 3D) ?- pour spécifer la pente, vaut-il mieux cliquer 2 points (B et A) ou faire une entrée au clavier (-0.04 pour 4% en descente ou 0.04 en montée) ? Avec ces réponses, je pense pouvoir arriver à faire quelque chose. Edit : pour la 4ème question, je pense qu'il est préférable de cliquer 2 points pour avoir le sens de la pente. [Edité le 23/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 23 janvier 2007 Auteur Posté(e) le 23 janvier 2007 - filaire projet : polyligne - en ce qui me concerne, c'est toujours le même "schéma" (plateforme, plateaux, voiries, trottoirs, talus ...)Je ne devrais jamais utiliser directement ce genre d'outil dans un autre SCU.(au pire, je reste en général et j'aligne en 3D ...) - les points altimétriques sont des points.(j'ai fais allusion à une p3d car pour moi bidouiller, c'est plus simple en reliant uniquement les points qui m'intéressent) - pour la pente, 2 points me parait une solution plus polyvalente, donc préférable.Par contre, il y a peut être un petit soucis à ce niveau là ... (je vais refaire une image et la poster...) D'avance, merci. Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 Re, Voilà un nouveau LISP (j'ai appelé la commande "test" mais tu peux la changer à ta guise) En l'état il faut le lancer dans le SCG, et que la polyligne du filaire projet soit dessinée dans le SCG ou un SCU dont le plan XY est parallèle à celui du SCG.Les points altimétriques sont reliés en une polyligne 3D et, en vue de dessus, de chaque point, la parallèle à la direction de la pente doit croiser le filaire projet. Il est demandé de sélectionner la poly 3D reliant les points altimétriques, puis la polyligne du filaire projet puis les points définissant la pente (A puis B) http://img156.imageshack.us/img156/8665/proj3dpoly23dt.png (defun 3d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (3d-coord->pt-lst (cdddr lst)) ) ) ) (defun c:test (/ bati fil pe1 pe2 3Dblst 2Dblst elv) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace acdoc) (vla-get-ModelSpace acdoc) ) ) (prompt "\nSélectionnez la polyligne 3D sur les points altimétriques." ) (while (not (setq bati (ssget "_:S:E" '((0 . "POLYLINE") (-4 . "&") (70 . 8)))) ) ) (prompt "\nSélectionnez la polyligne du filaire projet.") (while (not (setq fil (ssget "_:S:E" '((0 . "LWPOLYLINE") (210 0.0 0.0 1.0)))) ) ) (initget 1) (setq pe1 (trans (getpoint "\nSpécifiez la pente, premier point: ") 1 0 ) pe2 pe1 ) (while (equal pe1 pe2) (setq pe2 (trans (getpoint pe1 "\nDeuxième point: ") 1 0)) ) (setq bati (vlax-ename->vla-object (ssname bati 0))) (setq fil (vlax-ename->vla-object (ssname fil 0))) (setq 3Dblst (3d-coord->pt-lst (vlax-get bati 'Coordinates))) (setq elv (vla-get-elevation fil)) (setq 2Dblst (mapcar '(lambda (p) (list (car p) (cadr p) elv)) 3Dblst)) (setq ang (angle pe1 pe2)) (setq pen (/ (- (caddr pe2) (caddr pe1)) (distance pe2 (list (car pe1) (cadr pe1) (caddr pe2))) ) ) (setq llst (mapcar '(lambda (p) (vla-addLine space (vlax-3d-point p) (vlax-3d-point (polar p ang 1.0)) ) ) 2Dblst ) ) (setq ilst (mapcar '(lambda (l p) (vlax-invoke l 'IntersectWith fil acExtendThisEntity) ) llst 2Dblst ) ) (setq plst (mapcar '(lambda (p1 p2 p3) (list (car p1) (cadr p1) (+ (caddr p3) (* (distance p1 p2) pen)) ) ) ilst 2Dblst 3Dblst ) ) (vlax-invoke space 'add3dPoly (apply 'append plst)) (mapcar 'vla-delete llst) (princ) ) [Edité le 23/1/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 23 janvier 2007 Auteur Posté(e) le 23 janvier 2007 mode MyLife ONJ'ai supprimé mon message (le temps que je m'occupe d'une stagiaire et d'un bug réseau en plus de refaire une image, tu avais déjà mis un nouveau lisp)mode MyLife OFF Le nouvel outil à l'air de convenir parfaitement, mais j'ai un joli :Commande: (LOAD "C:/test.lsp") ; erreur: erreur de syntaxe Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 Au temps pour moi.C'est réparé, j'ai édité le code. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 23 janvier 2007 Auteur Posté(e) le 23 janvier 2007 Me revoilou ... (oui accessoirement entre temps je travail sur quelques charrettes ...) Merci beaucoup, le code fonctionne.J'ai plus qu'a me faire des blocs flèches en pente, avec 2 points d'accroche ...http://smileyonline.free.fr/images/gif/bravo/vignette/thumbnails/1036947074_gif.gif Par contre, dans certains cas précis, plutôt que de projeter plusieurs p3d et de m'y perdre, j'aimerais "modéliser" les pentes.Est-ce possible (en dehors du lisp) de "relier" par un maillage ou autre, deux p3d ? (sous entendu celle du pied de bâti et celle projetée) Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 23 janvier 2007 Posté(e) le 23 janvier 2007 Est-ce possible (en dehors du lisp) de "relier" par un maillage ou autre, deux p3d ? Oui, avec une surface réglée, commande SURFREGL (_RULESURF), il faut paramétrer la variable SURFTAB1 (nombre de mailles dans la direction M) avant de lancer la commande. 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