And another, allowing optional selection of a start point:- (defun c:ptx ( / *error* cnt des dis ent enx idx lay lst spt tmp txt ) (defun *error* ( msg ) (if (= 'file (type des)) (close des)) (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))) (princ (strcat "\nError: " msg)) ) (princ) ) (if (setq txt (getfiled "Create Output File" (cond ( ptx:dir ) ( "" )) "txt;csv" 1)) (while (not (progn (setvar 'errno 0) (setq ent (car (entsel "\nSelect 2D polyline : "))) (cond ( (= 7 (getvar 'errno)) (prompt "\nMissed, try again.") ) ( (null ent)) ( (/= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent))))) (prompt "\nThe selected object is not a 2D polyline.") ) ( (not (or des (and (setq des (open txt "w")) (setq ptx:dir (strcat (vl-filename-directory txt) "\")) (write-line "X,Y,Layer" des) ) ) ) (princ (strcat "\nUnable to open "" txt "" for writing.")) ) ( (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) enx)) lst (if (LM:listclockwise-p lst) lst (reverse lst)) lay (list "," (strcat "," (cdr (assoc 8 enx)))) ) (if (setq spt (getpoint "\nSpecify start point : ")) (progn (setq idx 0 cnt 1 spt (trans spt 1 ent) dis (distance spt (car lst)) ) (foreach pnt (cdr lst) (if (< (setq tmp (distance spt pnt)) dis) (setq dis tmp idx cnt ) ) (setq cnt (1+ cnt)) ) (repeat idx (setq lst (append (cdr lst) (list (car lst))))) ) ) (foreach vtx lst (write-line (apply 'strcat (mapcar 'strcat (mapcar 'rtos vtx) lay)) des) ) (write-line "" des) (prompt (strcat "\n" (itoa (length lst)) " vertices written to " (vl-filename-base txt) (vl-filename-extension txt) ".")) ) ) ) ) ) (princ "\n*Cancel*") ) (*error* nil) (princ));; List Clockwise-p - Lee Mac;; Returns T if the point list is clockwise oriented(defun LM:listclockwise-p ( lst ) (minusp (apply '+ (mapcar (function (lambda ( a b ) (- (* (car b) (cadr a)) (* (car a) (cadr b))) ) ) lst (cons (last lst) lst) ) ) ))(princ)
|