本帖最后由 llsheng_73 于 2024-11-19 16:56 编辑
 - (defun c:K(/ ss fuzz pt /pi4)
- (princ "\n选择要进行统计的圆(弧)对象-支持块参照")
- ;(setvar "osmode"(boole 7(getvar "osmode")16384))
- (and(setq ss(ssget'((0 . "CIRCLE,arc,insert"))))
- (or(setq text-height(getreal(strcat"\n请输入文字高度("(rtos(if text-height text-height 3.0)2 1)"): ")))
- (setq text-height 3.0))
- (setq fuzz 0.01 /pi4(* pi 0.25) pt(getpoint "\n选择输出基点:"))
- (vl-every(function(lambda(a / i txt r)
- (setq i(vl-position a ss)txt(chr(+ i 65))r(car a))
- (vl-every(function(lambda(a / p)
- (entmakex(mapcar(function cons)'(0 1 7 8 62 10 11 40 41 72 73)
- (List"TEXT"txt"STANDARD""圆孔统计"4(setq p(polar a /pi4(* r 1.2)))p text-height 0.8 0 1)))))(cdr a))
- (entmakex(mapcar(function cons)'(0 1 7 8 62 10 11 40 41 72 73)
- (List"TEXT"(strcat(substr(strcat txt"-"(itoa(1-(length a)))" ")1 8)"Φ"(rtos(+ r r)2 1))
- "STANDARD""圆孔统计"4(setq pt(mapcar'+(List 0(* text-height -1.5))pt))pt text-height 0.8 0 1)))))
- (setq ss(vl-sort(group-largest-circles ss fuzz)(function(lambda(a b)(<(car a)(car b)))))))
- )
- ; (setvar "osmode"(boole 2(getvar "osmode")16384))
- ; (princ)
- )
- ;; 取最大半径筛选同心圆(弧)并按半径分组一--支持块内圆(弧)
- (defun group-largest-circles(ss fuzz / i blocks ent bl p a l lst)
- (setq i -1 blocks(vlax-get-property(vlax-get-property(vlax-get-acad-object)'activedocument)'blocks))
- (repeat(sslength ss)
- (setq i(1+ i)ent(entget (ssname ss i)))
- (if(and(equal(assoc 0 ent)'(0 . "INSERT"))(equal(setq bl(cdr(assoc 41 ent)))(cdr(assoc 42 ent))1e-8)(setq p(cdr(assoc 10 ent))))
- (vlax-for a(vlax-invoke-method blocks'item(cdr(assoc 2 ent)))
- (and(vl-position(vlax-get-property a 'objectname)'("AcDbCircle""AcDbArc"))
- (setq a(entget(vlax-vla-object->ename a))
- l(cons(list(*(cdr(assoc 40 a))bl)(mapcar'+(mapcar'*(cdr(assoc 10 a))(list bl bl))p))l))))
- (setq l(cons(List(cdr(assoc 40 ent))(cdr(assoc 10 ent)))l))))
- (while l
- (setq a(car l)l(cdr l)r(car a)c(cadr a))
- (foreach b l
- (and(equal(cadr b)c fuzz)(setq a(list(max(car b)r)c)l(vl-remove b l))))
- (or(vl-position a lst)(setq lst(cons a lst))))
- (while lst
- (setq a(car lst)lst(cdr lst))
- (if(vl-some(function(lambda(x)(and(equal(car a)(car x)fuzz)(setq b x))))l)
- (setq l(subst(vl-list*(car b)(cadr a)(cdr b))b l))
- (setq l(cons a l)))))
- (alert "\n 本程序可用圆孔统计;启动命令【K】")
|