明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18226|回复: 60

★★★【尺寸文字自动避让程序源码】★★★

    [复制链接]
发表于 2009-1-13 18:19:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-1-14 10:08:28 编辑

;;尺寸文字避让
(defun c:yad_dimadjust(/ yad-dxf yad-perpt yad-chgent ss n m ent en ang w h l_dat l_mov oldang mov s pt pt1 pt2 l_adj en l_en disang disw dish item item1)
  (defun yad-dxf(en n)
    (if (not (listp en)) (setq en (entget en)))
    (cdr (assoc n en))
  )
  (defun yad-perpt(pt pt1 pt2)
    (inters pt1 pt2 pt (polar pt (+ (angle pt1 pt2) (/ pi 2)) 1200) nil)
  )
  (defun yad-chgent(en n / m val)
    (if (not (listp en)) (setq en (entget en)))
    (foreach itm n
      (setq m (car itm) val (cadr itm))
      (if (assoc m en)
        (setq en (subst (cons m val) (assoc m en) en))
        (setq en (append en (list (cons m val))))
      )
    )
    (entmod en)
  )
  (prompt "\n选择需要自动调整文字位置的一组标注尺寸:")
  (if (setq ss (ssget '((0 . "dimension")(-4 . "<or")(70 . 0)(70 . 1)(70 . 32)(70 . 33)(70 . 128)(70 . 129)(70 . 160)(70 . 161)(-4 . "or>"))))
    (progn
      (vl-cmdf "_undo" "_be")
      (vl-cmdf "_.dimedit" "_h" ss "")
      (setq n -1 m 0)
      (repeat (sslength ss)
        (setq ent (ssname ss (setq n (1+ n))))
        (setq en (yad-dxf (tblsearch "block" (yad-dxf ent 2)) -2))
        (while (/= (yad-dxf (setq en (entnext en)) 0) "MTEXT"))
        (setq ang (yad-dxf en 50) h (yad-dxf en 43) w (+ (/ (yad-dxf en 42) 2) (* 0.2 h)) h (* 0.6 h))
        (setq l_dat (cons (list ent ang w h) l_dat))
        (if (< (/ (yad-dxf ent 42) 2) w)
          (if (= (rem (setq m (1+ m)) 2) 0)
            (setq l_mov (cons (list ent ang w h) l_mov))
            (setq l_mov (append l_mov (list (list ent ang w h))))
          )
        )
      )
      (foreach itm l_mov
        (setq ent (car itm) ang (cadr itm) w (caddr itm) h (cadddr itm) pt (yad-dxf ent 11) oldang (angle pt (yad-perpt pt (setq pt1 (yad-dxf ent 10)) (polar pt1 ang 1200))) mov T)
        (while (and mov (setq s (ssget "_f" (list (setq pt1 (polar (polar pt ang w) (+ ang (/ pi 2)) h)) (setq pt2 (polar pt1 (+ ang pi) (* 2 w))) (setq pt2 (polar pt2 (- ang (/ pi 2)) (* 2 h))) (polar pt2 ang (* 2 w)) pt1)
                                           '((0 . "dimension")(-4 . "<or")(70 . 0)(70 . 1)(70 . 32)(70 . 33)(70 . 128)(70 . 129)(70 . 160)(70 . 161)(-4 . "or>"))
                                )))
          (setq n -1 l_adj nil)
          (repeat (sslength s)
            (setq en (ssname s (setq n (1+ n))))
            (if (and (ssmemb en ss) (not (equal en ent)) (setq l_en (yad-dxf l_dat en)) (equal ang (car l_en) 0.01))
              (progn
                (setq pt1 (yad-perpt (yad-dxf en 11) pt (polar pt ang 1200))
                      disang (angle pt1 pt)
                      disw (- (+ w (cadr l_en)) (distance pt pt1))
                      dish (- (+ h (caddr l_en)) (distance pt (yad-perpt (yad-dxf en 11) pt (polar pt (+ ang (/ pi 2)) 1200))))
                )
                (if (and (> dish 0) (not (equal dish 0 1)))
                  (if (setq item (vl-member-if '(lambda(e) (equal (car e) disang 0.01)) l_adj))
                    (setq item (car item) l_adj (subst (list disang (max disw (cadr item)) (max dish (caddr item))) item l_adj))
                    (setq l_adj (cons (list disang disw dish) l_adj))
                  )
                )
              )
            )
          )
          (cond
            ((not l_adj) (setq mov nil))
            ((and (= (length l_adj) 1) (setq item (car l_adj)) (> (setq disw (cadr item)) 0) (not (equal disw 0 1)) (> (caddr item) 0))
              (if (> (yad-dxf ent 70) 128)
                (progn
                  (setq pt1 (yad-perpt pt (setq pt2 (yad-dxf ent 10)) (polar pt2 ang 1200)))
                  (yad-chgent ent (list (list 11 (setq pt (polar pt (setq disang (angle pt pt1)) (* 2 (+ (distance pt pt1) (if (equal disang oldang 0.01) 0 h)))))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
                )
                (progn
                  (setq mov nil)
                  (yad-chgent ent (list (list 11 (polar pt (car item) disw)) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
                )
              )
            )
            ((and (= (length l_adj) 2) (setq item (car l_adj) item1 (cadr l_adj))
                  (or (and (> (setq disw (cadr item)) 0) (not (equal disw 0 1)) (> (caddr item) 0))
                      (and (> (setq disw (cadr item1)) 0) (not (equal disw 0 1)) (> (caddr item1) 0))
                  ))
              (if (or (> (yad-dxf ent 70) 128) (and (> (caddr item) 0) (> (caddr item1) 0) (> (setq disw (+ (cadr item) (cadr item1))) 0) (not (equal disw 0 1))))
                (progn
                  (setq pt1 (yad-perpt pt (setq pt2 (yad-dxf ent 10)) (polar pt2 ang 1200)))
                  (if (equal pt pt1 1) (setq disang (- ang (/ pi 2))) (setq disang (angle pt pt1)))
                  (yad-chgent ent (list (list 11 (setq pt (polar pt disang (* 2 (+ (distance pt pt1) (if (equal disang oldang 0.01) 0 h)))))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
                )
                (progn
                  (setq mov nil)
                  (if (or (< (caddr item) 0) (and (< (setq disw (cadr item)) 0) (not (equal disw 0 1))))
                    (setq item item1)
                  )
                  (yad-chgent ent (list (list 11 (polar pt (car item) (cadr item))) (list 70 (+ 128 (rem (yad-dxf ent 70) 128)))))
                )
              )
            )
            (T (setq mov nil))
          )
        )
      )
      (prompt "\n自动调整完毕!")
      (vl-cmdf "_undo" "_e")
    )
  )
  (princ)
)

评分

参与人数 6威望 +1 明经币 +3 金钱 +115 收起 理由
tigcat + 20 真好!
brbright + 1 + 50 很给力!
ucuc2003 + 5 赞一个!
zark + 20 很好
raimo + 10 好程序
Longfin + 1 + 2 + 10 【好评】好程序

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-8-18 19:36:52 | 显示全部楼层
这个程序真好,谢谢楼主
发表于 2021-8-18 14:00:35 | 显示全部楼层
这个程序真好,谢谢楼主
发表于 2019-7-21 12:38:01 | 显示全部楼层
谢谢楼主提供的好程序!
发表于 2009-1-13 18:31:00 | 显示全部楼层
本帖最后由 作者 于 2009-1-13 18:31:47 编辑

沙发???

先向楼主的无私奉献致敬。。。

学习一下。

发表于 2009-1-14 08:39:00 | 显示全部楼层
本帖最后由 作者 于 2009-1-14 8:42:34 编辑

这样的程序楼主也想得出,一级棒!!收藏了。

 楼主| 发表于 2009-1-14 10:10:00 | 显示全部楼层
修正了一下程序!
发表于 2009-1-14 12:41:00 | 显示全部楼层
学习一下LYY大哥的。
发表于 2010-10-12 16:40:00 | 显示全部楼层
真的很不错!学习了!
发表于 2010-11-2 17:43:00 | 显示全部楼层
好长好长阿。
发表于 2010-11-6 08:22:00 | 显示全部楼层
楼主高手啊
发表于 2011-1-15 12:54:54 | 显示全部楼层
看了楼主的介绍,应该是个不错的插件,下了试试一下
发表于 2011-2-25 20:49:18 | 显示全部楼层
谢谢。很需要这个程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-16 14:56 , Processed in 0.218150 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表