Aller au contenu

Convertir polyligne 3d en polyligne 2d


Messages recommandés

Posté(e)

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 ?

Posté(e)

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

Posté(e)

 

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

Posté(e)

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

Posté(e)

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

Posté(e)

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"

 

 

Posté(e)

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

  • 11 mois après...
Posté(e)

Bonjour à tous,

Voila après une verif j'aimerais savoir par quel procedé le z moyen de la poly3D est calculé ?

1.Moyenne des points

2.Moyenne des points/pente

3.Moyenne des points/points precedents

 

???

Merci d'avance

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité