明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2272|回复: 5

[提问] 标注断开和可标注避让有了,请问怎么把他们俩合起来?

[复制链接]
发表于 2014-7-24 10:05:28 | 显示全部楼层 |阅读模式
都取之于论坛,谢谢大家.一点也不懂LISP.

;;========================================
;; 标注断开+连续标注程序
;; by  明经通道  QQ: 9034598 2009年8月15日
;;========================================
(vl-load-com)
(defun c:ddr (/ n x ent entL p2 p3 px1 px2 py1 py2 ptdd xl sa pt0 ppt ptdd)
(setvar "cmdecho" 0)
(command "undo" "be")
(setq entL '())
(if (setq ent (centsel "\n选择标注 或 <退出>:" "DIMENSION"))
   (progn
     (setq x (entget ent)
        entL (cons ent entL)
          p2 (dxf 13 x)
          p3 (dxf 14 x)
          px1 (list (car p2) (/ (+ (cadr p2)(cadr p3)) 2.0))
          px2 (list (car p3) (/ (+ (cadr p2)(cadr p3)) 2.0))
          py1 (list (/ (+ (car p2)(car p3)) 2.0) (cadr p2))
          py2 (list (/ (+ (car p2)(car p3)) 2.0) (cadr p3))
          ptdd (list p2 p3)
          XL (entget (dxf -2 (tblsearch "block" (dxf 2 x))))
          SA (abs (sin (angle (dxf 10 xl) (dxf 11 xl)))))
   (while (setq pt0 (getpoint "\n取点 或 <退出>:"))
       (command ".copy" ent "" "0,0" "@")
       (setq entL (cons (entlast) entL))
    (cond
      ((equal SA 1 1e-6) ;;水平
         (setq ptdd (cons (ptper pt0 px1 px2) ptdd)
                 ppt (Lsort ptdd 0))
        )
      ((equal SA 0 1e-6) ;;垂直
         (setq ptdd (cons (ptper pt0 py1 py2) ptdd)
                ppt (Lsort ptdd 1))
       )
       (t (setq ptdd (cons (ptper pt0 p2 p3) ptdd)
            ppt (Lsort ptdd 2)))
      )
       (setq ppL (mapcar 'list ppt (cdr ppt))
              n 0)
         (repeat (length ppL)
           (setq xf (entget (nth n entL))
                nxf (subst (cons 13 (car  (nth n ppL)))(assoc 13 xf) xf)
                wxf (subst (cons 14 (cadr (nth n ppL)))(assoc 14 nxf) nxf)
                n (1+ n))
           (entmod wxf)
         )
     ))
  (princ "\n退出")
)
  (command "undo" "e") (setvar "cmdecho" 1)
  (princ)
)

(defun centsel (msg f)
(while (if (setq el (car (entsel msg))) (if (= (cdr (assoc 0 (entget el))) f) nil t) nil)) el
)
;;取值dxf
(defun dxf (x e)(cdr (assoc x e)))
;;求垂足
(defun ptper (pt0 pt1 pt2)
(inters pt0 (polar pt0 (+ (angle pt1 pt2) (/ pi 2)) 1.0) pt1 pt2 nil)
)
;;排序 0 水平 1 垂直 2 倾斜
(defun Lsort (LT i)
(cond
((or (= i 0)(= i 2))(setq Lt (vl-sort LT (function (lambda (e1 e2)(< (car e1) (car e2)))))))
((or (= i 1)(= i 2))(setq Lt (vl-sort LT (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))))))
))

(princ)








;;尺寸文字避让函数---------BY YAD
(defun yad_dimad1 (SS / 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 SS
    (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)
)



本帖被以下淘专辑推荐:

  • · 标注|主题: 4, 订阅: 0
发表于 2014-7-24 20:58:07 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2014-7-27 07:40 编辑
  1. (vl-load-com)
  2. (defun c:ddr (/ n x ent entL p2 p3 px1 px2 py1 py2 ptdd xl sa pt0 ppt ptdd ss1)
  3. (setvar "cmdecho" 0)
  4. (command "undo" "be")
  5. (setq entL '() ss1 (ssadd))
  6. (if (setq ent (centsel "\n选择标注 或 <退出>:" "DIMENSION")) (progn
  7.   (ssadd ent ss1);+1
  8.   (setq x (entget ent)
  9.         entL (cons ent entL)
  10.         p2 (dxf 13 x)
  11.         p3 (dxf 14 x)
  12.         px1 (list (car p2) (/ (+ (cadr p2)(cadr p3)) 2))
  13.         px2 (list (car p3) (/ (+ (cadr p2)(cadr p3)) 2))
  14.         py1 (list (/ (+ (car p2)(car p3)) 2) (cadr p2))
  15.         py2 (list (/ (+ (car p2)(car p3)) 2) (cadr p3))
  16.         ptdd (list p2 p3)
  17.         XL (entget (dxf -2 (tblsearch "block" (dxf 2 x))))
  18.         SA (abs (sin (angle (dxf 10 xl) (dxf 11 xl)))))
  19.   (while (setq pt0 (getpoint "\n取点 或 <退出>:"))
  20.     (command ".copy" ent "" "0,0" "@")
  21.     (setq entL (cons (entlast) entL))
  22.     (ssadd (entlast) ss1);+2
  23.    (cond
  24.       ((equal SA 1 1e-6) ;;水平
  25.         (setq ptdd (cons (ptper pt0 px1 px2) ptdd)
  26.               ppt (Lsort ptdd 0))
  27.       )
  28.       ((equal SA 0 1e-6) ;;垂直
  29.         (setq ptdd (cons (ptper pt0 py1 py2) ptdd)
  30.               ppt (Lsort ptdd 1))
  31.       )
  32.       (t
  33.          (setq ptdd (cons (ptper pt0 p2 p3) ptdd)
  34.                ppt (Lsort ptdd 2))
  35.       )
  36.     )
  37.      (setq ppL (mapcar 'list ppt (cdr ppt))
  38.             n 0)
  39.      (repeat (length ppL)
  40.        (setq xf (entget (nth n entL))
  41.              nxf (subst (cons 13 (car  (nth n ppL)))(assoc 13 xf) xf)
  42.              wxf (subst (cons 14 (cadr (nth n ppL)))(assoc 14 nxf) nxf)
  43.              n (1+ n))
  44.        (entmod wxf)
  45.      )
  46.    )
  47. )
  48.   (princ "\n退出")
  49. )
  50. (yad_dimad1 ss1);+3
  51. (command "undo" "e") (setvar "cmdecho" 1)
  52. (princ)
  53. )
  54. (defun centsel (msg f)
  55. (while (if (setq el (car (entsel msg))) (if (= (cdr (assoc 0 (entget el))) f) nil t) nil))
  56. el
  57. )
  58. ;;取值dxf
  59. (defun dxf (x e)(cdr (assoc x e)))
  60. ;;求垂足
  61. (defun ptper (pt0 pt1 pt2)
  62. (inters pt0 (polar pt0 (+ (angle pt1 pt2) (/ pi 2)) 1.0) pt1 pt2 nil)
  63. )
  64. ;;排序 0 水平 1 垂直 2 倾斜
  65. (defun Lsort (LT i)
  66. (cond
  67. ((or (= i 0)(= i 2))(setq Lt (vl-sort LT '(lambda (e1 e2)(< (car e1) (car e2))))))
  68. ((or (= i 1)(= i 2))(setq Lt (vl-sort LT '(lambda (e1 e2)(< (cadr e1) (cadr e2))))))
  69. )
  70. )
  71. (princ)

点评

今天找到用了下,好用,谢谢Z版!  发表于 2020-7-22 16:11
 楼主| 发表于 2014-7-26 21:19:02 | 显示全部楼层
先谢谢楼上的大大,我去试试
发表于 2020-8-20 13:12:40 | 显示全部楼层
这个标注文字避让是跟天正那样的吗?
发表于 2022-5-11 11:41:51 | 显示全部楼层

请问为什么我用不了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 03:25 , Processed in 0.159292 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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