给你个思路,理解后,纯LISP可以写出来,xd::list:groupbyindex 开源函数库有,纯LISP
 - (defun c:tt ()
- (if (and (setq
- e1 (car
- (xdrx-entsel "\n拾取最下X方向线<退出>:" '((0 . "*line")))
- )
- )
- (setq
- e2 (car
- (xdrx-entsel "\n拾取最左Y方向线<退出>:" '((0 . "*line")))
- )
- )
- (setq ss (xdrx-ssget "\n选择圆<退出>:" '((0 . "circle"))))
- )
- (progn (setq pnts (xdrx-getpropertyvalue ss "position")
- lnx (xdrx-getpropertyvalue e1 "get")
- lny (xdrx-getpropertyvalue e2 "get")
- ydir (xdrx-vector-normalize (mapcar '- (cadr lny) (car lny)))
- xdir (xdrx-vector-normalize (mapcar '- (cadr lnx) (car lnx)))
- r (xdrx-getpropertyvalue (ssname ss 0) "radius")
- )
- (setq lst
- (xd::list:groupbyindex
- (mapcar '(lambda (x)
- (setq
- dis (distance (xdrx-point-project x lnx ydir) x)
- )
- (list dis x)
- )
- pnts
- )
- r
- )
- )
- ;;得到行
- (setq
- lst1 (mapcar
- '(lambda (x)
- (apply
- 'append
- (mapcar
- 'cdr
- (xd::list:groupbyindex
- (mapcar '(lambda (y)
- (setq
- dis (distance
- (xdrx-point-project y lny xdir)
- y
- )
- )
- (list dis y)
- )
- x
- )
- r
- )
- )
- )
- )
- (mapcar 'cdr lst)
- )
- ) ;得到列
- (xdrx-prompt "\n表格:"
- (1- (length lst1))
- "*"
- (1- (length (car lst1)))
- )
- (xdrx-setvar "pdmode" 99)
- (setq i 0)
- (mapcar '(lambda (x)
- (xdrx-setpropertyvalue (xdrx-point-make x)
- "color"
- (setq i (1+ i))
- )
- )
- lst1
- )
- )
- )
- (princ)
- )
|