JMBZ38 Posté(e) le 12 août 2014 Posté(e) le 12 août 2014 Bonjour, Existe-t-il sous Covadis une commande permettant à partir d'une polyligne 3D de positionner un point sur cette polyligne à un Z précis ? Merci d'avance
rimbo Posté(e) le 12 août 2014 Posté(e) le 12 août 2014 Bonjour, c'est pas très clair... si tu fait un clic droit après avoir sélectionner ta polyligne / opération 3d / grille de modification, tu auras la possibilité de mettre une alti sur n'importe quel sommet de ta polyligne puis poser un point topo dessus le sommet.si tu est sur la V13 ou V14 tu as aussi l'icone en bas d'autocad sur la même ligne que l'accrobj qui permet de modifier les grip de la poly 3d afin de sélectionner le sommet et de modifier directement l'alti. Cordialement Lionel PERRIN | Ingénieur/Consultant Formateur expert Infrastructure - Géomédia Civil 3D/Covadis/Autopiste/Infraworks 360 - VRD/Infrastructure routière ferroviaire Bus TRAM
JMBZ38 Posté(e) le 12 août 2014 Auteur Posté(e) le 12 août 2014 Quelques précisions sur ma demande: L'origine et l'extrémité sont des points définis et imposés avec des Z différents. Je cherche à tracer un point sur la ligne pour une altitude donnée.Tout comme je peux tracer une ligne de niveau sur un MNT à un Z donné, je souhaite tracer un point sur polyligne 3D à un Z donné.
capde06 Posté(e) le 12 août 2014 Posté(e) le 12 août 2014 je sais pasmais en lisp ca donne ca...voila (defun c:valalti() (setq oldos (getvar "osmode")) (setq pt1 (trans (getpoint "\n1er point ")1 0)) (setq pt2 (trans (getpoint "\n2eme point ")1 0)) (princ "\n") (princ (caddr pt1)) (princ "\n") (princ (caddr pt2)) (setq val (getreal "\nAltitude recherchée ; ")) (setq newpt (cap-i3d pt1 pt2 val)) (setvar "osmode" 0) (command "point" (trans (list (car newpt)(cadr newpt)val) 0 1) ) (setvar "osmode" oldos) ) (defun cap-i3d (p1 p2 comp) (setq c (/ (- (caddr p1) comp) (- (caddr p2) comp)) newx (/ (- (* c (car p2)) (car p1)) (- c 1)) newy (/ (- (* c (cadr p2)) (cadr p1)) (- c 1)) ) ;_ Fin de setq (list newx newy) ) Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
JMBZ38 Posté(e) le 12 août 2014 Auteur Posté(e) le 12 août 2014 Rien à dire à par chapeau ! C'est exactement ce qu'il me fallait ! Par hasard, est-ce qu'il existe une commande Covadis pour réaliser cette prouesse ?
capde06 Posté(e) le 12 août 2014 Posté(e) le 12 août 2014 comme je le dit au debutje sais pas Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
_christian_ Posté(e) le 12 août 2014 Posté(e) le 12 août 2014 salut, Dans la grille de modification des polylignes tu as le Z de chaque sommet ainsi que la longueur est la pente. Tu peux grâce à tous ces éléments, déterminer la position de ton point à un Z donné. A+ Autocad Map 3D 2018Covadis Autopiste version 17.0eMensura Génius V8
JMBZ38 Posté(e) le 12 août 2014 Auteur Posté(e) le 12 août 2014 Pourquoi faire des calculs manuels et répétitifs alors qu' une commande peut le faire automatiquement ?
patrick.albinet Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 Tu coupes la ligne en un point et tu la jointes apres. Le point est créé. Et si tu veux un point topo, tu reimmatricule uniquement ta polyligne.Et si tu veux une alti precis, tu la modifies direct dans les proprietes autocad
JMBZ38 Posté(e) le 13 août 2014 Auteur Posté(e) le 13 août 2014 La manip proposée est intéressante, mais ce que je veux éviter c'est d'avoir à calculer les coordonnées de ce troisième point. Je veux veux bien entendu que les 3 points soit alignés. Lorsque je fait un chenal en pente, imagine le pied de talus formé par une poly 3d avec un Z de départ et un Z d'arrivé. Je cherche tous les points à une altitude ronde de cette poly 3D.
JMBZ38 Posté(e) le 13 août 2014 Auteur Posté(e) le 13 août 2014 La manip proposée est intéressante, mais ce que je veux éviter c'est d'avoir à calculer les coordonnées de ce troisième point. Je veux veux bien entendu que les 3 points soit alignés. Lorsque je fait un chenal en pente, imagine le pied de talus formé par une poly 3d avec un Z de départ et un Z d'arrivé. Je cherche tous les points à une altitude ronde de cette poly 3D.
patrick.albinet Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 Les 3 points seront alignés mais effectivement, l'altitude ne sera pas une valeur ronde
JMBZ38 Posté(e) le 13 août 2014 Auteur Posté(e) le 13 août 2014 Tout le problème est là: Partir d'une poly 3D et pouvoir poser sur celle-ci des points à des Z bien précis et sans avoir à faire des constructions et calculs. Merci à capde06 pour sa macro. Etant donner que c'est une manip que je fais assez régulièrement lors de plans d'excavation, existe-t-il une commande spécifique dans Covadis ?
capde06 Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 sur un post précédentj'avais posté une macro de courbe de niveau sur des face3dil est tres facile de le modifier pour ne dessiner qu'une courbe a une altitude donnéesi ca intéresse .....le voila modifié (defun c:courbeniv () (setq zmax -9999999.99 zmin 9999999.99 cpx 0 plan 125 listsom nil ;tpoly nil plcourt (getvar "clayer") oldos (getvar "osmode") espace nil ) ;_ Fin de setq (setq oldordretrace (getvar "DRAWORDERCTL")) (setvar "DRAWORDERCTL" 0) (setvar "cmdecho" 0) (setvar "osmode" 0) (if (not (tblsearch "LAYER" "TOPO-COURBES-NIVEAU")) (cap_crea_pl "TOPO-COURBES-NIVEAU" 7) ) (if (not (tblsearch "LAYER" "TOPO-COURBES-NIVEAU-5")) (cap_crea_pl "TOPO-COURBES-NIVEAU-5" 2) ) (if (not (tblsearch "LAYER" "TOPO-COURBES-NIVEAU-10")) (cap_crea_pl "TOPO-COURBES-NIVEAU-10" 3) ) (setvar "clayer" "TOPO-COURBES-NIVEAU") ;(command "scu" "g") (setq sel (ssget '((0 . "3DFACE")))) ;; recherche zmini zmaxi (repeat (sslength sel) (setq ent (ssname sel cpx) dxf10 (cdr (assoc 10 (entget ent))) dxf11 (cdr (assoc 11 (entget ent))) dxf12 (cdr (assoc 12 (entget ent))) dxf10z (caddr dxf10) dxf11z (caddr dxf11) dxf12z (caddr dxf12) ) ;_ Fin de setq (if (> dxf10z zmax) (setq zmax dxf10z) ) ;_ Fin de if (if (> dxf11z zmax) (setq zmax dxf11z) ) ;_ Fin de if (if (> dxf12z zmax) (setq zmax dxf12z) ) ;_ Fin de if (if (< dxf10z zmin) (setq zmin dxf10z) ) ;_ Fin de if (if (< dxf11z zmin) (setq zmin dxf11z) ) ;_ Fin de if (if (< dxf12z zmin) (setq zmin dxf12z) ) ;_ Fin de if (setq listsom (cons (list dxf10 dxf11 dxf12) listsom)) (setq cpx (+ cpx 1)) ) ;_ Fin de repeat (prompt (strcat "\nAltitude maxi : " (rtos zmax 2 0) " - Altitude mini : " (rtos zmin 2 0) ) ;_ Fin de strcat ) ;_ Fin de prompt ;(setq espace (getreal "\nValeur de l'espacement des courbes : ")) (if (not espace) (setq espace 1) ) ;_ Fin de if (setq val (getreal "\nAltitude recherchée ; ")) ;;;; creation liste des coupes (setq listcoupe nil cp (fix zmin) ) ;_ Fin de setq (while (< cp zmax) ; (/(fix (- zmax zmin))espace) (setq cp (+ cp espace)) (setq listcoupe (cons cp listcoupe)) ) ;_ Fin de repeat ;(setq listcoupe (reverse listcoupe)) (setq listcoupe (list val)) ;;========================================================== (foreach plan listcoupe ;(print plan) (setq cpx 0) ;_ Fin de setq (repeat (length listsom) (setq llist (nth cpx listsom)) (setq p1 (car llist) p2 (cadr llist) p3 (caddr llist) ) ;_ Fin de setq (setq mini (min (caddr p1) (caddr p2) (caddr p3) ) ;_ Fin de min maxi (max (caddr p1) (caddr p2) (caddr p3) ) ;_ Fin de max ) ;_ Fin de setq (setq pt1 nil pt2 nil pt3 nil listcal nil ) ;_ Fin de setq (if (and (>= plan mini) (<= plan maxi)) (progn (if (and (<= plan (caddr p1)) (> plan (caddr p2))) (setq listcal (cons (cap-i3d p1 p2 plan) listcal)) ) ;_ Fin de if (if (and (<= plan (caddr p1)) (> plan (caddr p3))) (setq listcal (cons (cap-i3d p1 p3 plan) listcal)) ) ;_ Fin de if (if (and (<= plan (caddr p2)) (> plan (caddr p3))) (setq listcal (cons (cap-i3d p2 p3 plan) listcal)) ) ;_ Fin de if+++ (if (and (>= plan (caddr p1)) (< plan (caddr p2))) (setq listcal (cons (cap-i3d p1 p2 plan) listcal)) ) ;_ Fin de if (if (and (>= plan (caddr p1)) (< plan (caddr p3))) (setq listcal (cons (cap-i3d p1 p3 plan) listcal)) ) ;_ Fin de if (if (and (>= plan (caddr p2)) (< plan (caddr p3))) (setq listcal (cons (cap-i3d p2 p3 plan) listcal)) ) ;_ Fin de if (remove_doubles listcal) (cond ((= (length listcal)1) ;_ Fin de = (if (equal plan (caddr p1)) (setq listcal (cons p1 listcal)) ) (if(equal plan (caddr p2)) (setq listcal (cons p2 listcal)) ) (if(equal plan (caddr p3)) (setq listcal (cons p3 listcal)) ) (cap_cn_pol (car listcal) (cadr listcal)) ) ((> (length listcal) 1) (cap_cn_pol (car listcal) (cadr listcal)) ) ;_ Fin de progn ) ;_ Fin de cond ) ) ;_ Fin de if (setq cpx (+ cpx 1)) ; ) ;_ Fin de repeat ) ;_ Fin de foreach (setq sel (ssget "x" '((0 . "LINE") (8 . "TOPO-COURBES-NIVEAU*")))) ;_ Fin de setq (setvar "peditaccept" 1) (setvar "splinetype" 5) (command "_pedit" "m" sel "" "j" "0" "") (setvar "peditaccept" 0) ;;traitement des couleurs (setq sel (ssget "x" '((0 . "LWPOLYLINE") (8 . "TOPO-COURBES-NIVEAU*")))) ;_ Fin de setq (setq cpt 0) (print "======================") (repeat (sslength sel) (setq ent (ssname sel cpt)) (setq elev (cdr(assoc 38 (entget ent)))) (cond ((= (rem elev 10.) 0.) (upd_ent ent 8 "TOPO-COURBES-NIVEAU-10") ) ((= (rem elev 5.) 0.) (upd_ent ent 8 "TOPO-COURBES-NIVEAU-5") ) ) (setq cpt (+ cpt 1)) ) ;;=========================== (setvar "DRAWORDERCTL" oldordretrace) (setvar "osmode" oldos) (setvar "clayer" plcourt) ) ;_ Fin de defun ;;;fonctions================================================================ (defun c:crea_blk_cn () (if (not (tblsearch "BLOCK" "CNTXT")) (progn (entmake '((0 . "BLOCK") (100 . "AcDbEntity") (8 . "0") (100 . "AcDbBlockBegin") (2 . "CNTXT") (70 . 2) (10 0.0 0.0 0.0) ) ) (entmake '((0 . "LINE") (8 . "0") (62 . 0) (10 -0.5 0. 0.) (11 0.5 0. 0.) ) ) (entmake '((0 . "ATTDEF") (100 . "AcDbEntity") (8 . "0") (62 . 0) (40 . 0.08) (100 . "AcDbText") (10 0.0 0.0 0.0) (100 . "AcDbAttributeDefinition") (3 . "Pente ?") (2 . "PENTE") ) ) (entmake '((0 . "ENDBLK") (8 . "0"))) ) ) ) (defun remove-i (ind lst) (if (or (zerop ind) (null lst)) (cdr lst) (cons (car lst) (remove-i (1- ind) (cdr lst))) ) ) (defun remove_doubles (lst) (if lst (cons (car lst) (remove_doubles (vl-remove (car lst) lst))) ) ) (defun cap_cn_pol (a B) (setq pt1 (list (car a) (cadr a)) pt2 (list (car B) (cadr B)) ) ;_ Fin de setq (if (not (equal pt1 pt2)) (entmake (list '(0 . "LINE") '(8 . "TOPO-COURBES-NIVEAU") (cons 10 (list (car a) (cadr a) plan)) (cons 11 (list (car B) (cadr B) plan)) '(210 0.0 0.0 1.0) ) ;_ Fin de list ) ;_ Fin de entmake ) ;_ Fin de if ) ;_ Fin de defun (defun cap-i3d (p1 p2 comp) (setq c (/ (- (caddr p1) comp) (- (caddr p2) comp)) newx (/ (- (* c (car p2)) (car p1)) (- c 1)) newy (/ (- (* c (cadr p2)) (cadr p1)) (- c 1)) ) ;_ Fin de setq (list newx newy) ) ;_ Fin de defun ;; ; met a jour une entite : entité avant entget + code + valeur (defun upd_ent (obj code txt) (setq obj (entget obj)) (entmod (subst (cons code txt) (assoc code obj) obj)) ) ;_ Fin de defun (defun cap_crea_pl (pl cl) (if (not (tblsearch "LAYER" pl)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 pl) '(70 . 0) (cons 62 cl) '(6 . "Continuous") ) ) ) ) (defun cap_cn_pol1 (a B) (setq pt1 (list (car a) (cadr a)) pt2 (list (car B) (cadr B)) ) ;_ Fin de setq (if (not (equal pt1 pt2)) (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(8 . "TOPO-COURBES-NIVEAU") '(100 . "AcDbPolyline") '(90 . 2) '(70 . 128) ;'(43 . 00) (cons 38 plan) ;'(39 . 0.0) (cons 10 pt1) ;'(40 . 0.0) '(41 . 0.0) ;'(42 . 0.0) '(91 . 0) (cons 10 pt2) ; '(40 . 0.0) '(41 . 0.0) ;'(42 . 0.0) '(91 . 0) ; '(210 0.0 0.0 1.0) ) ;_ Fin de list ) ;_ Fin de entmake ) ;_ Fin de if ) Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
tiphon Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 BonjourA ma connaissance, il n'existe pas dans Covadis de commande pouvant répondre à ton besoin. Le lisp que popose capde06 permet d'arriver rapidement à la solution exacte.Peut être qu'en combinant pas mal de commandes dans Covadis, on pourra arriver à la solution mais ce sera beaucoup plus long.Exemple : dessiner un profil en long à partir de la polyligne 3d; Dessiner sur le profil en long une polyligne horizontale à l'altitude souhaitée; Demander à matérialiser sur la vue en plan l'intersection entre la ligne horizontale et la courbe du profil en long pour trouver le point recherché! Cordialement
Olivier Eckmann Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 Bonjour, avec quelque chose comme ça en s'inspirant du code de cap06 et en ajoutant la sélection multiple de poly3D (defun c:ZSurPoly( / val JEU I oPoly oVtx oVtxLst PT1 PT2 newpt) (if (and (setq val (getreal "\nAltitude recherchée : ")) (setq JEU (ssget (list (cons 0 "POLYLINE")))) (setq I 0) ) (progn (repeat (sslength JEU) (setq oPoly (ssname JEU I)) (setq I (1+ I)) (setq PT1 nil) (if (= 8 (logand (cdr (assoc 70 (entget oPoly))) 8)) (progn (setq oVtx (entnext oPoly)) (while (/= "SEQEND" (cdr (assoc 0 (setq oVtxLst (entget oVtx))))) (setq PT2 (cdr (assoc 10 oVtxLst))) (setq newPt nil) (if (and PT1 (or (and (>= (caddr PT1) val) (<= (caddr PT2) val)) (and (<= (caddr PT1) val) (>= (caddr PT2) val)) ) ) (progn (setq newPt (cap-i3d pt1 pt2 val)) ) ) (setq PT1 PT2) (setq oVtx (entnext oVtx)) (if newPt (entmake (list (cons 0 "POINT") (cons 10 (list (car newpt) (cadr newpt) val)) (cons 8 (getvar "CLAYER")) ) ) ) ) ) ) ) ) ) ) (defun cap-i3d (p1 p2 comp) (setq c (/ (- (caddr p1) comp) (- (caddr p2) comp)) newx (/ (- (* c (car p2)) (car p1)) (- c 1)) newy (/ (- (* c (cadr p2)) (cadr p1)) (- c 1)) ) ;_ Fin de setq (list newx newy) ) Olivier
capde06 Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 belle méthode Oliviermais ma fonction cap-i3d ne calcul que la position en 2dil faudrai que tu rajoutes le Z a la variable newpt Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
JMBZ38 Posté(e) le 13 août 2014 Auteur Posté(e) le 13 août 2014 C'est terrible, vous êtes des pros ! Plus qu'à rajouter une instruction pour avoir une commande qui se répète et ce sera parfait !!!
Olivier Eckmann Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 Bonjour, j'avais déjà modifié la valeur retournée par ta fonction (list newx newy comp)au lieu de (list newx newy) Olivier
capde06 Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 je n'avais pas vumais ca reste delicat de modifier une fonctiond'autre prog l'utilisent comme les courbes de niveau plus haut dans le postmieux vaut la renommer Vous fîtes ce que vous pûtes et vous m'épatâtes !!!!
Olivier Eckmann Posté(e) le 13 août 2014 Posté(e) le 13 août 2014 Effectivement, j'ai modifié le programme pour ajouter le Z au point 2D renvoyé par ta fonction Olivier
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