本帖最后由 llsheng_73 于 2014-4-16 00:26 编辑
郁闷,给你弄了小半天,最后要回复的时候找不到这个帖子了,东找西找眼睛都看花了才找到地方
 - (Defun STB(TAB / snl sll)
- (SetQ snl '()sll (TblNext TAB T))
- (While (SetQ snl (Cons (Cdr (Assoc 2 sll)) snl)sll (TblNext TAB nil)))
- (vl-sort snl '<))
- (defun SStoES(s / m n e)
- (if s(progn
- (setq n(sslength s)m 0)
- (while(< m n)
- (setq e(if e(append e(list(ssname s m)))(list(ssname s m)))m(1+ m))))
- )e)
- (defun c:tt(/ la lys p p1 p2 pt s1 s2 e q1 q2 y);;引线只支持LWPOLYLINE,对于POLYLINE没有进行处理
- (setq la nil p1 nil p2 nil
- lys(STB"LAYER"))
- (while(not(member la lys))(setq la(getstring(strcat"\n图层名"(vl-princ-to-string lys)":"))))
- (while(null p1)(setq p1(getpoint"框选第一点")))
- (setq p2(getcorner p1"框选第二点"))
- (if p2(progn
- (setq pt(list p1(list(car p1)(cadr p2)0)p2(list(cadr p1)(car p2)0))
- s1(SSTOES(ssget "CP" pt(list(cons 0 "TEXT,MTEXT")(cons 8 la))))
- s2(SSTOES(ssget "CP" pt(list(cons 0 "LWPOLYLINE")(cons 8 la)))))
- (foreach e1 s1
- (vla-getboundingbox(vlax-ename->vla-object e1)'p1 'p2)
- (setq p1(vlax-safearray->list p1)
- p2(vlax-safearray->list p2)pt nil
- p(list(/(+(car p1)(car p2))2)(/(+(cadr p1)(cadr p2))2)))
- (foreach e2 s2
- (setq obj(vlax-ename->vla-object e2)
- d1(distance(vlax-curve-getClosestPointTo obj p)p)
- d2(distance(vlax-curve-getClosestPointTo obj p t)p)
- pt(append pt(list(list d1 d2 e2)))))
- (setq e1(nth 2(car(vl-sort pt(function(lambda(e1 e2)(<(car e1)(car e2)))))))
- e2(nth 2(car(vl-sort pt(function(lambda(e1 e2)(<(cadr e1)(cadr e2))))))))
- (setq e nil)
- (if(/= e1 e2)(progn(command"zoom""C" p(/(getvar"VIEWSIZE")2))
- (while(null e)(setq e(entsel"\n无法确定与该文字对应的注记线,需要你来确定")))
- (setq e(car e))
- (command"zoom""p"))
- (setq e e1))
- (setq e1(vlax-ename->vla-object e)
- q1(vlax-curve-getstartPoint e1)
- q2(vlax-curve-getendPoint e1)
- e(entget e))
- (if(>(-(cadr p1)(cadr q1))(-(cadr p1)(cadr q2)))
- (setq p q1 y(cadr q2))
- (setq p q2 y(cadr q1)))
- (setq pt(list(list (car p1)y)(list(car p2)y)p))
- (foreach e1 e
- (if(=(car e1)10) (setq p(car pt)e(subst(list 10(car p)(cadr p))e1 e)pt(vl-remove p pt))))
- (entmod e)
- )))
- )
;;命令你可以改成你需要的,运行时会先把图层全部列出来,让你输入你将要处理的对象所在的图层,然后会叫你指定两个框选点,接下来根据那两个点选定你先前所给图层上的文字和多线段进行处理
;;要求线只能是LWPOLYLINE, 对于POLYLINE没有弄,如果实在需要,可以进一步完善,希望能达到你的要求
|