明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2592|回复: 8

[已解答] 标注断开 和标注合并都 可以用,只是不能先选择再执行,请教明经ER帮忙一下,万分感谢

[复制链接]
发表于 2014-10-25 11:12:36 | 显示全部楼层 |阅读模式
4明经币
;;========================================
;; 标注断开+连续标注程序
;; 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)



;;标注合并
(defun c:ddc( / d13 d14 dxf dxfn e1 e2 n p13 p14 plst ss)
  (command "ucs" "w")
  (setvar "cmdecho" 0)
  (princ "\n选择标注尺寸...")
  (setq ss (ssget '((0 . "DIMENSION"))))
  (setq n -1 plst '())
  (repeat (sslength ss)
     (setq dxf (entget (ssname ss (setq n (1+ n)))))
     (setq d13 (cdr (assoc 13 dxf))
           d14 (cdr (assoc 14 dxf)))
     (setq plst (cons d13 (cons d14 plst)))
  )
  (setq plst (vl-sort plst (function (lambda (e1 e2) (< (car e1) (car e2))))))
  (setq plst (vl-sort plst (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))))   
  (setq p13 (car plst) p14 (last plst))
  (setq dxfn (subst (cons 13 p13) (assoc 13 dxf) dxf)
        dxfn (subst (cons 14 p14) (assoc 14 dxfn) dxfn))
  (entmake dxfn)
  (command ".erase" ss "")
  (command "ucs" "p")
  (princ)
)



标注断开 和标注合并都 可以用,只是不能先选择再执行,请教明经ER帮忙一下,万分感谢

最佳答案

查看完整内容

主要修改了centsel函数,可以先选择了
发表于 2014-10-25 11:12:37 | 显示全部楼层
主要修改了centsel函数,可以先选择了

  1. (vl-load-com)
  2. (defun c:ddr (/ n x ent entl p2 p3 px1 px2 py1 py2 ptdd xl sa pt0 ppt ptdd)
  3.   (setvar "cmdecho" 0)
  4.   (if (setq ent (centsel "\n选择标注 或 <退出>:" "DIMENSION"))
  5.     (progn
  6.       (setq x         (entget ent)
  7.             entl (cons ent entl)
  8.             p2         (dxf 13 x)
  9.             p3         (dxf 14 x)
  10.             px1         (list (car p2) (/ (+ (cadr p2) (cadr p3)) 2.0))
  11.             px2         (list (car p3) (/ (+ (cadr p2) (cadr p3)) 2.0))
  12.             py1         (list (/ (+ (car p2) (car p3)) 2.0) (cadr p2))
  13.             py2         (list (/ (+ (car p2) (car p3)) 2.0) (cadr p3))
  14.             ptdd (list p2 p3)
  15.             xl         (entget (dxf -2 (tblsearch "block" (dxf 2 x))))
  16.             sa         (abs (sin (angle (dxf 10 xl) (dxf 11 xl))))
  17.       )
  18.       (while (setq pt0 (getpoint "\n取点 或 <退出>:"))
  19.         (command "undo" "be")

  20.         (command ".copy" ent "" "0,0" "@")
  21.         (setq entl (cons (entlast) entl))
  22.         (cond
  23.           ((equal sa 1 1e-6)
  24.            ;;水平
  25.            (setq ptdd (cons (ptper pt0 px1 px2) ptdd)
  26.                  ppt  (lsort ptdd 0)
  27.            )
  28.           )
  29.           ((equal sa 0 1e-6)
  30.            ;;垂直
  31.            (setq ptdd (cons (ptper pt0 py1 py2) ptdd)
  32.                  ppt  (lsort ptdd 1)
  33.            )
  34.           )
  35.           (t
  36.            (setq ptdd (cons (ptper pt0 p2 p3) ptdd)
  37.                  ppt  (lsort ptdd 2)
  38.            )
  39.           )
  40.         )
  41.         (setq ppl (mapcar 'list ppt (cdr ppt))
  42.               n          0
  43.         )
  44.         (repeat        (length ppl)
  45.           (setq        xf  (entget (nth n entl))
  46.                 nxf (subst (cons 13 (car (nth n ppl))) (assoc 13 xf) xf)
  47.                 wxf (subst (cons 14 (cadr (nth n ppl))) (assoc 14 nxf) nxf)
  48.                 n   (1+ n)
  49.           )
  50.           (entmod wxf)
  51.         )

  52.         (command "undo" "e")
  53.       )
  54.     )
  55.     (princ "\n退出")
  56.   )

  57.   (setvar "cmdecho" 1)
  58.   (princ)
  59. )

  60. (defun centsel (msg f / ent ss)
  61.   (princ msg)
  62.   (while (null ent)
  63.     (setq ss (ssget  (list (cons 0 f))))
  64.     (if        ss
  65.       (setq ent (ssname ss 0))
  66.     )
  67.   )
  68.   (redraw ent 3)
  69.   ent
  70. )
  71. ;;取值dxf
  72. (defun dxf (x e) (cdr (assoc x e)))
  73. ;;求垂足
  74. (defun ptper (pt0 pt1 pt2)
  75.   (inters pt0 (polar pt0 (+ (angle pt1 pt2) (/ pi 2)) 1.0) pt1 pt2 nil)
  76. )
  77. ;;排序 0 水平 1 垂直 2 倾斜
  78. (defun lsort (lt i)
  79.   (cond
  80.     ((or (= i 0) (= i 2)) (setq lt (vl-sort lt (function (lambda (e1 e2) (< (car e1) (car e2)))))))
  81.     ((or (= i 1) (= i 2))
  82.      (setq lt (vl-sort lt (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))))
  83.     )
  84.   )
  85. )

  86. (princ)
回复

使用道具 举报

发表于 2014-10-25 13:17:33 | 显示全部楼层
合并只要把ucs的那行去掉就可以了,断开因为是使用entsel的,也没法改先选后执行。

  1. (defun c:ddc (/ d13 d14 dxf dxfn e1 e2 n p13 p14 plst ss)
  2.   (setvar "cmdecho" 0)
  3.   (princ "\n选择标注尺寸...")
  4.   (setq ss (ssget '((0 . "DIMENSION"))))
  5.   (setq n -1)
  6.   (repeat (sslength ss)
  7.     (setq dxf (entget (ssname ss (setq n (1+ n)))))
  8.     (setq d13 (cdr (assoc 13 dxf))
  9.           d14 (cdr (assoc 14 dxf))
  10.     )
  11.     (setq plst (cons d13 (cons d14 plst)))
  12.   )
  13.   (setq        plst (vl-sort plst
  14.                       (function (lambda (e1 e2) (< (car e1) (car e2))))
  15.              )
  16.         plst (vl-sort plst
  17.                       (function (lambda (e1 e2) (< (cadr e1) (cadr e2))))
  18.              )

  19.         p13  (car plst)
  20.         p14  (last plst)

  21.         dxfn (subst (cons 13 p13) (assoc 13 dxf) dxf)
  22.         dxfn (subst (cons 14 p14) (assoc 14 dxfn) dxfn)
  23.   )
  24.   
  25.   (command "undo" "be")
  26.   
  27.   (entmake dxfn)
  28.   (command ".erase" ss "")
  29.   
  30.   (command "undo" "e")
  31.   (setvar "cmdecho" 1)
  32.   (princ)
  33. )

评分

参与人数 1明经币 +1 收起 理由
hooboxu + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-10-25 13:35:23 | 显示全部楼层
谢谢楼上的,本人一点也不懂LSP,所以...
还有个一断开有大神帮忙解决一下么?
回复

使用道具 举报

 楼主| 发表于 2014-10-26 11:19:12 | 显示全部楼层
这分不足以表示我对你的感谢,对你的热心鼓掌10分钟,真心感谢~
回复

使用道具 举报

发表于 2020-11-24 09:21:59 | 显示全部楼层
谢谢分享
~~~~
回复

使用道具 举报

发表于 2021-2-1 20:55:26 | 显示全部楼层

谢谢分享!!!
回复

使用道具 举报

发表于 2022-3-22 03:27:48 | 显示全部楼层
vectra 发表于 2014-10-25 11:12
主要修改了centsel函数,可以先选择了

不错不错,这是我想要的效果。
回复

使用道具 举报

发表于 2024-9-23 16:32:41 | 显示全部楼层
高手,受教了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 23:29 , Processed in 0.208869 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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