本帖最后由 作者 于 2009-3-23 0:17:16 编辑
在晓东上,热心的高手kmdz已经完成得差不多了: 思路:复制选集中的一个标注,提取选集的13,14成表,移除13和14相同的项,得到新标注的两个端点,修改复制的那个标注定义数据。标注位置可以自己指定,也可由程序自行计算位置。
代码:(defun c:t1 () (defun *error* (msg) (print msg) (print "\n检查标注是否都在一条线上或有重合?") (entdel (entlast)) (setq *error* nil dim-dxf-lst nil ) ) (while (and (not (prompt "\n选择需要累加的标注:")) (setq dim-ss (ssget '((0 . "DIMENSION") (1 . "")))) (> (setq dim-ss-n (sslength dim-ss)) 1) (vl-cmdf "copy" (ssname dim-ss 0) "" '(0 0) '(0 0)) (setq dim-dxf-14 (cdr (assoc 14 (entget (ssname dim-ss 0)))) dim-dxf-10 (cdr (assoc 10 (entget (ssname dim-ss 0)))) dim-dis-1410 (distance dim-dxf-14 dim-dxf-10) dim-ang-1410 (angle dim-dxf-14 dim-dxf-10) dim-dxf-10 (polar dim-dxf-10 dim-ang-1410 (* dim-dis-1410 (1- dim-ss-n)) ) ) ) (if (setq tmp (getpoint "\n指定尺寸标注位置:")) (setq dim-dxf-10 tmp) ) (setq dim-dxf-lst nil) (repeat dim-ss-n (setq dim-dxf-lst (append (list (cdr (assoc 13 (entget (ssname dim-ss (setq dim-ss-n (1- dim-ss-n)))) ) ) (cdr (assoc 14 (entget (ssname dim-ss dim-ss-n)))) ) dim-dxf-lst ) ) ) (foreach m dim-dxf-lst (setq i 0) (foreach n dim-dxf-lst (if (equal m n) (if (> (setq i (1+ i)) 1) (setq dim-dxf-lst (vl-remove m dim-dxf-lst)) ) ) ) ) (setq dim-ent (entget (entlast)) dim-ent (subst (cons 13 (nth 0 dim-dxf-lst)) (assoc 13 dim-ent) dim-ent ) dim-ent (subst (cons 14 (nth 1 dim-dxf-lst)) (assoc 14 dim-ent) dim-ent ) dim-ent (subst (cons 10 dim-dxf-10) (assoc 10 dim-ent) dim-ent) ) (entmod dim-ent) ) )
但有个问题,标注线是在一条直线上,但首尾标注点不对齐的话,好像就处理不了。
而且,可不可以改成只需要确定偏移的方向,就可以自动在离标注线500的位置进行标注呢? |