geomou Posté(e) le 15 juin 2009 Posté(e) le 15 juin 2009 Bonjour à tous, J'ai une série de polyligne 3D dont tous les sommets ont la même altitude.Afin de pouvoir utiliser une certaine commande, je devrais pouvoir les transformer en polyligne 2d tout en gardant leur altitude initiale.Existe-t-il une commande ou une routine qui permettrait cela ?Flatten ainsi que 2 autres commandes lisp trouvées sur internet convertissent les polylignes en 2 d mais les aplatissent à l'altitude 0, ce qui ne m'arrange pas. Quelqu'un a-t-il la solution miracle ?
rebcao Posté(e) le 16 juin 2009 Posté(e) le 16 juin 2009 Bonjour, SANS bidouille particulière, on peut DECOMPOSER la polyligne, puis la reconstruire avec PEDIT ! Le tout optimisé dans une MACRO ! Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
bonuscad Posté(e) le 16 juin 2009 Posté(e) le 16 juin 2009 Bonjour En partant de ce vieux sujet et avec une adaptation rapide. (defun c:PL3DtoZmoy ( / js flag_ps flag_ucs old_osmd lay_cur elev_cur n ent l_dxf lay_nam s_dxf 2d_lsom z_l flag_cl flag_sp nw_pt) (setq js (ssget "_X" '((0 . "POLYLINE") (-4 . "&=") (70 . 8) (410 . "Model")))) (cond (js (setvar "cmdecho" 0) (command "_.undo" "_begin") (if (zerop (getvar "tilemode")) (progn (setq flag_ps T) (setvar "tilemode" 1) ) (setq flag_ps nil) ) (if (zerop (getvar "worlducs")) (progn (setq flag_ucs T) (command "_.ucs" "_world") ) (setq flag_ucs nil) ) (setq old_osmd (getvar "osmode") lay_cur (getvar "clayer") elv_cur (getvar "elevation")) (repeat (setq n (sslength js)) (setq l_dxf (entget (setq ent (ssname js (setq n (1- n))))) lay_nam (cdr (assoc 8 l_dxf)) s_dxf (entget (entnext (cdar l_dxf))) 2d_lsom nil z_l nil ) (if (zerop (boole 1 1 (cdr (assoc 70 l_dxf)))) (setq flag_cl nil) (setq flag_cl T) ) (if (zerop (boole 1 4 (cdr (assoc 70 l_dxf)))) (setq flag_sp nil) (setq flag_sp T) ) (while (/= (cdr (assoc 0 s_dxf)) "SEQEND") (if (zerop (boole 1 207 (cdr (assoc 70 s_dxf)))) (setq nw_pt (cdr (assoc 10 s_dxf)) 2d_lsom (cons (list (car nw_pt) (cadr nw_pt) 0.0) 2d_lsom) z_l (cons (caddr nw_pt) z_l) ) ) (setq s_dxf (entget (entnext (cdar s_dxf)))) ) (setvar "clayer" lay_nam) (setvar "elevation" (* (+ (apply 'max z_l) (apply 'min z_l)) 0.5)) (command "_.pline" (foreach n 2d_lsom (command n)) ) (cond ((and flag_cl flag_sp) (command "_.pedit" (entlast) "_close" "_spline" "") ) (flag_cl (command "_.pedit" (entlast) "_close" "") ) (flag_sp (command "_.pedit" (entlast) "_spline" "") ) ) (entdel ent) (setvar "osmode" old_osmd) ) (if flag_ucs (command "_.ucs" "_previous")) (if flag_ps (setvar "tilemode" 0)) (setvar "clayer" lay_cur) (command "_.undo" "_end") (princ (strcat "\n" (itoa (sslength js)) " 3Dpoly(s) ont leurs Z moyen, et sont converties en 2Dpoly ou LWPOLYLINE.")) (setvar "elevation" elv_cur) ) (T (princ "\nAucune 3Dpoly trouvée") ) ) (setvar "cmdecho" 1) (prin1) ) Si la polyligne 3D à des Z différents, c'est le Zmoyen (entre ZMaxi et Zmini) qui sera prit. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
lecrabe Posté(e) le 16 juin 2009 Posté(e) le 16 juin 2009 Hello Cette routine serait TIP-TOP si elle posait la question pour le Z (Elevation) final de la Polyligne 2D générée pour chaque Polyligne 3D :Altitude 1er point ou Altitude Dernier point ou Altitude moyenne ? Le Decapode Autodesk Expert Elite Team
geomou Posté(e) le 16 juin 2009 Auteur Posté(e) le 16 juin 2009 J'ai essayé la routine en question mais cela ne fonctionne pas (je ne suis vraiment pas expert dans ce domaine :( )Quand je veux lancer la commande, j'obtiens le message suivant : "PL3DtoZmoy ; erreur:paramètre de la variable autoCAD rejeté:"clayer" "VOIRIE_bordure". Ce calque existe bel et bien dans ma liste mais il n'est ni courant (il est même gelé) et ne contient pas non plus les polyligne 3D
(gile) Posté(e) le 16 juin 2009 Posté(e) le 16 juin 2009 Salut, Je savais bien que j'avais déjà fait un truc comme ça. adapté à partir de celle-là (defun c:toto (/ *error* doc opt del ss alt zlst pl) (vl-load-com) (defun *error* (msg) (and (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (and ss (vla-delete ss)) (vla-EndUndoMark doc) (princ) ) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8))) (progn (vla-StartUndoMark doc) (initget "maXimum miNimum moYenne") (or (setq opt (getkword "\Altitude de la polyligne plane [maXimum/miNimum/moYenne] : " ) ) (setq opt "moYenne") ) (initget "Oui Non") (or (setq del (getkword "\nSupprimer la polyligne 3d source ? [Oui/Non] : ") ) (setq del "Non") ) (vlax-for p (setq ss (vla-get-ActiveSelectionSet doc)) (setq pts (3d-coord->pt-lst (vlax-get p 'Coordinates)) zlst (mapcar 'caddr pts) alt (cond ((= opt "maXimum") (apply 'max zlst) ) ((= opt "miNimum") (apply 'min zlst) ) (T (/ (apply '+ zlst) (length pts))) ) pl (vlax-invoke (vla-get-ModelSpace doc) 'addLightWeightPolyline (apply 'append (mapcar '(lambda (p) (setq p (trans p 0 (trans '(0 0 1) 1 0 T))) (list (car p) (cadr p)) ) pts ) ) ) ) (vla-put-elevation pl alt) (vla-put-Closed pl (vla-get-Closed p)) (if (= del "Oui") (vla-delete p) ) ) (vla-delete ss) (vla-EndUndoMark doc) ) ) (princ) ) ;;; 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)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
geomou Posté(e) le 16 juin 2009 Auteur Posté(e) le 16 juin 2009 C'est déjà mieux mais j'ai encore un message d'erreur après qu'il m'ait demandé si je voulais supprimer la polyligne3d source. J'obtiens le message "Erreur: no function definition: 3D-COORD->PT-LST"
(gile) Posté(e) le 16 juin 2009 Posté(e) le 16 juin 2009 C'est déjà mieux La routine gracieusement donnée par Bonuscad fonctionne pourtant très bien. mais j'ai encore un message d'erreur J'avais oublié de joindre une petite routine Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
RhymOne Posté(e) le 7 juin 2010 Posté(e) le 7 juin 2010 Bonjour à tous,Voila après une verif j'aimerais savoir par quel procedé le z moyen de la poly3D est calculé ?1.Moyenne des points2.Moyenne des points/pente3.Moyenne des points/points precedents ???Merci d'avance DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
(gile) Posté(e) le 7 juin 2010 Posté(e) le 7 juin 2010 C'est la moyenne des altitudes : (/ (apply '+ zlst) (length pts)) 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