;;加载XLRX_API后使用:
 - (defun c:tt (/ SS N PTS PTS1 L Y PTS2 X diff)
- (initget 4)
- (setq diff (getreal "\n输入容差值<0.001>"))
- (if (null diff) (setq diff 0.001))
- (if (setq ss (ssget '((0 . "point"))))
- (progn
- (repeat (setq n (sslength ss))
- (setq pts
- (cons (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))
- pts
- )
- )
- )
- (setq m (XLRX-Mat-SetCoordSystem
- (setq o (getpoint "\n基点:"))
- (setq v (mapcar '- (getpoint o "\n方向:") o))
- (XLRX-Vec-perpVec v)
- )
- invm (XLRX-Mat-Inverse m)
- )
- (setq pts (XLRX-Points-TransFormBy pts invm))
- ;;点自上而下,自左而右排序
- (setq pts1 (vl-sort pts
- '(lambda (a b)
- (if (equal (cadr a) (cadr b) diff)
- (< (car a) (car b))
- (> (cadr a) (cadr b))
- )
- )
- )
- )
- (while pts1
- (setq l (list (car pts1))
- pts1 (cdr pts1)
- y (cadar pts1)
- )
- (while (and pts1 (equal y (cadar pts1) diff))
- (setq l (cons (car pts1) l)
- pts1 (cdr pts1)
- )
- )
- (xlrx-make "lwpolyline" (XLRX-Points-TransFormBy l m))
- )
- ;;点自左而右 自上而下排序
- (setq pts2 (vl-sort pts
- '(lambda (a b)
- (if (equal (car a) (car b) diff)
- (> (cadr a) (cadr b))
- (< (car a) (car b))
- )
- )
- )
- )
- (while pts2
- (setq l (list (car pts2))
- pts2 (cdr pts2)
- x (caar pts2)
- )
- (while (and pts2 (equal x (caar pts2) diff))
- (setq l (cons (car pts2) l)
- pts2 (cdr pts2)
- )
- )
- (xlrx-make "lwpolyline" (XLRX-Points-TransFormBy l m))
- )
- )
- )
- )
|