Hello Marko.
I can not find the exact words, to tell you how grateful I am.
It works very well.
The only thing I see is that it is very slow.
I do not know if that can be improved.
Another thing I see is that in cones, only draw the top ring.
I attached a file with a cone.
In case you want to see it.
Add a time function to the code to see how long it really takes.
And modify a line of the code, so that the 3d polyline was not closed.
(defun c:3dpolyaround3dfaces (/ car-vl-member-if unique uniquepl ss i 3df pl pll plll el ell elll k z p1 p2 3dppl tiempo)
(defun car-vl-member-if (f l / ff r)
(setq ff '(lambda (x)
(if (apply f (list x))
(setq r x))))
(if (vl-some ff l)
r))
(defun unique (l)
(if l
(cons (car l)
(unique (vl-remove-if
'(lambda (x)
(and (vl-some '(lambda (y) (equal y (car (car l)) 1e-6)) x)
(vl-some '(lambda (y) (equal y (cadr (car l)) 1e-6)) x)
(vl-some '(lambda (y) (equal y (caddr (car l)) 1e-6)) x)
(vl-some '(lambda (y) (equal y (cadddr (car l)) 1e-6)) x)))
l)))))
(defun uniquepl (l)
(if l
(cons (car l) (uniquepl (vl-remove-if '(lambda (x) (equal x (car l) 1e-6)) l)))))
(prompt "\nSelect 3DFACE entities to
process...")
(setq ss (ssget '((0 . "3DFACE"))))
(if ss
(progn ;; Add
(setq tiempo (getvar "millisecs"))
;;
(repeat (setq i (sslength ss))
(setq 3df (ssname ss (setq i (1- i))))
(setq pl (mapcar 'cdr (vl-remove-if-not '(lambda (x) (vl-position (car x) '(10 11 12 13))) (entget 3df))))
(setq pll (cons pl pll)))
(setq plll (vl-remove-if '(lambda (x) (<= (length (uniquepl x)) 2)) pll))
(setq plll (unique plll))
(foreach pl plll
(setq el (mapcar '(lambda (a b) (list a b)) pl (cdr (reverse (cons (car pl) (reverse pl))))))
(setq ell (append el ell)))
(setq ell (vl-remove-if '(lambda (x) (equal (apply 'distance x) 0.0 1e-6)) ell))
(setq k -1
elll ell)
(foreach e1 ell
(setq k (1+ k)
z nil)
(foreach e2 (vl-remove nil
(mapcar '(lambda (x)
(if (null z)
(setq z 0)
(setq z (1+ z)))
(if (/= k z)
x))
ell))
(if (or (equal e1 e2 1e-6) (equal e1 (reverse e2) 1e-6))
(setq elll (vl-remove e1 elll)))))
(setq el (car elll))
(setq p1 (car el)
p2 (cadr el))
(setq 3dppl (cons p1 3dppl))
(setq elll (cdr elll))
(while (setq el (car-vl-member-if '(lambda (x) (or (equal p2 (car x) 1e-6) (equal p2 (cadr x) 1e-6))) elll))
(if (equal (car el) p2 1e-6)
(setq p1 (car el)
p2 (cadr el))
(setq p1 (cadr el)
p2 (car el)))
(setq elll (vl-remove el elll))
(setq 3dppl (cons p1 3dppl)))
(setq 3dppl (cons p2 3dppl))
(vl-cmdf "_.3DPOLY")
(foreach p 3dppl (vl-cmdf "_non" p))
;; Mod
(tmp-ejec tiempo)
(vl-cmdf "_non" "")
;;
))
(princ))
(defun c:3pa3f nil (c:3dpolyaround3dfaces))
;;; Tiempo
(defun tmp-ejec (tmp)
(princ
(strcat "\nTiempo de ejecucion: " (rtos (/ (- (getvar "millisecs") tmp) 1000.0) 2 2) " Segundos.")))
Thank you.
AutoCAD 2026
Visual Studio Code 1.99.3
AutoCAD AutoLISP Extension 1.6.3
Windows 10 (64 bits)