这里有一种方法仍然使用repeat,但不是ssget“x”,而是使用ssget“c”
*为子系统的ssget更新的编辑代码
- (defun c:RowAreas (/ lEnt lDat ss tCirc subSs total test subSs_lst cLst Rad flag)
- (vl-load-com)
- (if (and (setq lEnt (car (entsel "\nSelect Vertical Line: ")))
- (eq "LINE" (cdadr (entget lEnt))))
- (progn
- (setq lDat (list (cdr (assoc 10 (entget lEnt)))
- (cdr (assoc 11 (entget lEnt)))))
- (princ "\n\nLEFT:\n")
- (repeat 2
- (setq test 1)
- (if (setq ss (ssget "_X" (list '(0 . "CIRCLE")(cons -4 (if flag ">=,*,*" "<=,*,*"))
- (cons 10
- (append
- (list
- (apply
- (if flag 'max 'min)
- (mapcar 'car lDat)))
- '(0 0))))))
- (while (not (zerop (sslength ss)))
- (setq tCirc (ssname ss 0))
- (if (setq subSs (ssget "_X" (list (cons 0 "CIRCLE")
- (cons -4 (if flag ">=,=,*" "<=,=,*"))
- (cons 10
- (append
- (list
- (apply
- (if flag 'max 'min)
- (mapcar 'car lDat)))
- (cddr (assoc 10 (entget tCirc))))))))
- (progn
- (setq total 0.0)
- (foreach ent (setq subSs_lst
- (mapcar 'cadr
- (ssnamex subSs)))
- (setq total (+ total (vla-get-Area
- (vlax-ename->vla-object ent)))))
- (setq cLst
- (vl-sort
- (mapcar '(lambda (x) (cdr (assoc 10 (entget x)))) subSs_lst)
- '(lambda (x1 x2) (< (car x1) (car x2))))
- Rad
- (vl-sort
- (mapcar '(lambda (x) (cdr (assoc 40 (entget x)))) subSs_lst)
- '(lambda (r1 r2) (> r1 r2))))
- (mapcar '(lambda (x) (ssdel x ss)) subSs_lst)
- (princ (strcat "\nRow " (itoa test)
- "; MinXCtr: " (vl-princ-to-string (car cLst))
- " MaxRad = " (vl-princ-to-string (car Rad))
- " => " " Total = "(rtos total)
- "\n-----------------------------------------"))))
- (ssdel tCirc ss)
- (setq test (1+ test))))
- (and (not flag) (princ "\n\nRIGHT:\n"))
- (setq flag T))
- (textscr))
- (princ "\n<!> No Line Selected <!>"))
- (princ ))
|