明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1071|回复: 7

求修改拉线标注

[复制链接]
发表于 2024-9-27 01:26:30 | 显示全部楼层 |阅读模式
2明经币
在明经看到的一个拉线标注代码,但是不管遇到文字还是填充或者尺寸,它都会识别出来。

请求大神增加过滤文字、填充、标注功能。
代码如下:
  1. (defun C:LXBZ (/ minsize          pt1         pt2        ss     intlist
  2.                                                         x            y           lds          olden         pts1        pts2   n      ens
  3.                                                         code   i           ptx          endata
  4.                                                 )
  5. (prompt "【快速拉线标注,产生交点的位置都会被认为是标注点】")
  6. (setvar "CMDECHO" 0)
  7. (YY_KAISHI_YY)      
  8.   (if ddf_old_minsize
  9.     (setq minsize ddf_old_minsize)
  10.   )
  11.         (command "undo" "be")
  12.   (if
  13.     (progn (initget "S")
  14.                         (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  15.     )
  16.                 (progn
  17.                         (while (= "S" pt1)
  18.                                 (if (null ddf_old_minsize)
  19.                                         (setq minsize (getdist "\n请输入过滤尺寸,默认为<5mm>"))
  20.                                         (setq minsize (getdist        (strcat        "\n请输入过滤尺寸,上次输入为<"
  21.                                                                                                                                                                         (rtos ddf_old_minsize 2 2)
  22.                                                                                                                                                                         "mm>"
  23.                                                                                                                                                                 )
  24.                                                                                                 )
  25.                                         )
  26.                                 )
  27.                                 (if (null minsize)
  28.                                         (setq minsize 5)
  29.                                 )
  30.                                 (setq ddf_old_minsize minsize)
  31.                                 (initget "S")
  32.                                 (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  33.                         )                                        ;end while
  34.                         (if (null minsize)
  35.                                 (setq minsize 5)
  36.                         )
  37.                         (setq ddf_old_minsize minsize)
  38.                         (setq pt2 (getpoint pt1 "\n指定标注方向"))
  39.                         (if (and pt1 pt2)
  40.                                 (progn
  41.                                         (setq pt1(polar pt1 (angle pt2 pt1) minsize))
  42.                                         (setq pt2(polar pt2 (angle pt1 pt2) minsize))                              
  43.                                 )                       
  44.                         )
  45.                         (if (setq ss (ssget "F"
  46.                                                                                  (list pt1 pt2)
  47.                                                                                  ;;'((0 . "*E,CIRCLE,ARC") (6 . "BYLAYER"))
  48.                                                                          )
  49.                                         )
  50.                                 (progn
  51.                                         (setq intlist ()
  52.                                                 endata  (ssnamex ss)
  53.                                         )
  54.                                         (foreach x endata
  55.                                                 (foreach y (cdddr x) (setq intlist (cons (cadr y) intlist)))
  56.                                         )
  57.                                         ;;点要排序一下才行,按从开始点的距离来排序
  58.                                         (setq lds (+ 10 (distance pt1 pt2)))
  59.                                         (setq intlist (vl-remove-if-not
  60.                                                                                                         '(lambda (x) (<= (distance x pt1) lds))
  61.                                                                                                         intlist
  62.                                                                                                 )
  63.                                         )
  64.                                         (setq
  65.                                                 intlist (vl-sort intlist
  66.                                                                                         '(lambda (x y)
  67.                                                                                                  (< (distance pt1 x) (distance pt1 y))
  68.                                                                                          )
  69.                                                                                 )
  70.                                         )
  71.                                         ;;这里开始写标注程序
  72.                                         (setq olden (entlast)
  73.                                                 ss    (ssadd)
  74.                                         )
  75.                                         (setq n 0)
  76.                                         (repeat (- (length intlist) 1)
  77.                                                 (setq pts1 (nth n intlist)
  78.                                                         pts2 (nth (1+ n) intlist)
  79.                                                 )
  80.                                                 (if (> (distance pts1 pts2) minsize)
  81.                                                         (ddf_entmakedim pts1 pts2)
  82.                                                 )
  83.                                                 (setq n (1+ n))
  84.                                         )                                ;end repeat
  85.                                         (while        (setq ens (entnext olden))
  86.                                                 (setq ss    (ssadd ens ss)
  87.                                                         olden ens
  88.                                                 )
  89.                                         )
  90.                                         (if(>(getvar"OSMODE")16384)(princ)(setvar"OSMODE"(+(getvar"OSMODE")16384)));;默认关闭捕捉
  91.                                         ;(if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(princ));默认打开捕捉
  92.                                         ;;下面开始来移动
  93.                                         (setq loop t);;;带捕捉的grread框架开始
  94.                                         (while loop                                       
  95.                                                 (setq gr (grread t 15 0) code (car gr) ptx (cadr gr))
  96.                                                 (cond
  97.                                                         ((= code 3)(redraw) (setq loop nil))  ; 鼠标左键
  98.                                                         ((= code 5)                           ; 鼠标移动
  99.                                                                 (redraw)
  100.                                                                 (if (>(getvar"OSMODE")16384)
  101.                                                                         (princ)
  102.                                                                         (setq ptx (osnappt nil ptx))
  103.                                                                 )        
  104.                                                                 ;;根据获取的动态点坐标更新程序-开始
  105.                                                                 (setq i 0)
  106.                                                                 (repeat (sslength ss)
  107.                                                                         (setq endata (entget (ssname ss i)))
  108.                                                                         (entmod (subst (cons 10 ptx) (assoc 10 endata) endata))
  109.                                                                         (setq i (1+ i))
  110.                                                                 ); end repeat               
  111.                                                                 ;;根据获取的动态点坐标更新程序-结束
  112.                                                         )
  113.                                                         ((member code '(2 6))                ; 键盘输入--"F3"键
  114.                                                                 (if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(setvar"OSMODE"(+(getvar"OSMODE")16384))));切换捕捉开关
  115.                                                         ;((= code 2)                         ; 键盘输入
  116.                                                         ;        (princ "\n键盘输入=")(princ pt))
  117.                                                         ((member code '(11 25)); 鼠标右击
  118.                                                                 (redraw)  (setq loop nil)
  119.                                                         )
  120.                                                 )
  121.                                         );end while;;;;;带捕捉的grread框架结束
  122.                                 )
  123.                         )                                        ;end if
  124.                 );end progn
  125.         )                                        ;end if
  126.         (princ "\n标注完成")
  127. (YY_END_YY)
  128.         (command "undo" "END")
  129.         (prin1)
  130. )                                        ;end
  131. (defun ddf_entmakedim (pt1 pt2 /)
  132.         (cond
  133.                 ((or (equal 0 (angle pt1 pt2) 0.001)
  134.                          (equal pi (angle pt1 pt2) 0.001)
  135.                  )
  136.                         (entmake
  137.                                 (list
  138.                                         '(0 . "DIMENSION")
  139.                                         '(100 . "AcDbEntity")
  140.                                         '(100 . "AcDbDimension")
  141.                                         (cons 10 pt1)
  142.                                         '(70 . 32)
  143.                                         '(1 . "")
  144.                                         '(100 . "AcDbAlignedDimension")
  145.                                         (cons 13 pt1)
  146.                                         (cons 14 pt2)
  147.                                         '(100 . "AcDbRotatedDimension")
  148.                                 )
  149.                         )
  150.                 )
  151.                 ((or (equal (/ pi 2) (angle pt1 pt2) 0.001)
  152.                          (equal (* pi 1.5) (angle pt1 pt2) 0.001)
  153.                  )
  154.                         (entmake
  155.                                 (list
  156.                                         '(0 . "DIMENSION")
  157.                                         '(100 . "AcDbEntity")
  158.                                         '(100 . "AcDbDimension")
  159.                                         (cons 10 pt1)
  160.                                         '(70 . 33)
  161.                                         '(1 . "")
  162.                                         '(100 . "AcDbAlignedDimension")
  163.                                         (cons 13 pt1)
  164.                                         (cons 14 pt2)
  165.                                 )
  166.                         )
  167.                 )
  168.                 ((and (null (equal 0 (angle pt1 pt2) 0.001))
  169.                          (null (equal (/ pi 2) (angle pt1 pt2) 0.001))
  170.                  )
  171.                         (entmake
  172.                                 (list
  173.                                         '(0 . "DIMENSION")
  174.                                         '(100 . "AcDbEntity")
  175.                                         '(100 . "AcDbDimension")
  176.                                         (cons 10 pt1)
  177.                                         '(70 . 33)
  178.                                         '(1 . "")
  179.                                         '(100 . "AcDbAlignedDimension")
  180.                                         (cons 13 pt1)
  181.                                         (cons 14 pt2)
  182.                                 )
  183.                         )
  184.                 )
  185.         )                                        ;end cond
  186. )                                        ;end
  187. (prin1)
  188. ;;; grread捕捉子函数
  189. (defun osnappt (name pt / color d h k lst nearpt nearpt2 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x)
  190.         (if name (entdel name))
  191.         (redraw)
  192.         (if (< (getvar "osmode") 16384);;打开捕捉
  193.                 (progn
  194.                         (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences (vlax-get-acad-object))))
  195.                                 h (/ (getvar "viewsize") (cadr (getvar "screensize"))) d (getvar "pickbox")
  196.                                 lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 1.5 d h))
  197.                         (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT"))(setq osmo 1))
  198.                         (if (and(setq nearpt2 (osnap pt "_NEA"))(not (equal nearpt nearpt2 k)))
  199.                                 (setq osmo 2 nearpt nearpt2))
  200.                         (if (and(setq nearpt2 (osnap pt "_MID"))(equal nearpt nearpt2 k))
  201.                                 (setq osmo 3 nearpt nearpt2))
  202.                         (if (and(setq nearpt2 (osnap pt "_INT"))(equal nearpt nearpt2 k))
  203.                                 (setq osmo 4 nearpt nearpt2))))
  204.         (if name(entdel name))
  205.         (if nearpt
  206.                 (progn
  207.                         (setq ptx (car nearpt)pty (cadr nearpt))
  208.                         (foreach x lst
  209.                                 (setq pt1 (list (- ptx x) (- pty x)) pt2 (list (+ ptx x) (- pty x))
  210.                                         pt3 (list (+ ptx x) (+ pty x)) pt4 (list (- ptx x) (+ pty x))
  211.                                         pt5 (list ptx (+ pty x)))
  212.                                 (cond
  213.                                         ((= osmo 1)(grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1)))
  214.                                         ((= osmo 2)(grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1)))
  215.                                         ((= osmo 3) (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1)))
  216.                                         ((= osmo 4) (grvecs (list color pt1 pt3 color pt2 pt4)))))
  217.                         (setq pt nearpt)))
  218.         pt
  219. )


发表于 2024-9-27 01:26:31 | 显示全部楼层
  1. (defun C:LXBZ (/ minsize          pt1         pt2        ss     intlist
  2.                                                         x            y           lds          olden         pts1        pts2   n      ens
  3.                                                         code   i           ptx          endata
  4.                                                 )
  5. (prompt "【快速拉线标注,产生交点的位置都会被认为是标注点】")
  6. (setvar "CMDECHO" 0)
  7. (YY_KAISHI_YY)      
  8.   (if ddf_old_minsize
  9.     (setq minsize ddf_old_minsize)
  10.   )
  11.         (command "undo" "be")
  12.   (if
  13.     (progn (initget "S")
  14.                         (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  15.     )
  16.                 (progn
  17.                         (while (= "S" pt1)
  18.                                 (if (null ddf_old_minsize)
  19.                                         (setq minsize (getdist "\n请输入过滤尺寸,默认为<5mm>"))
  20.                                         (setq minsize (getdist        (strcat        "\n请输入过滤尺寸,上次输入为<"
  21.                                                                                                                                                                         (rtos ddf_old_minsize 2 2)
  22.                                                                                                                                                                         "mm>"
  23.                                                                                                                                                                 )
  24.                                                                                                 )
  25.                                         )
  26.                                 )
  27.                                 (if (null minsize)
  28.                                         (setq minsize 5)
  29.                                 )
  30.                                 (setq ddf_old_minsize minsize)
  31.                                 (initget "S")
  32.                                 (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  33.                         )                                        ;end while
  34.                         (if (null minsize)
  35.                                 (setq minsize 5)
  36.                         )
  37.                         (setq ddf_old_minsize minsize)
  38.                         (setq pt2 (getpoint pt1 "\n指定标注方向"))
  39.                         (if (and pt1 pt2)
  40.                                 (progn
  41.                                         (setq pt1(polar pt1 (angle pt2 pt1) minsize))
  42.                                         (setq pt2(polar pt2 (angle pt1 pt2) minsize))                              
  43.                                 )                       
  44.                         )
  45.                         (if (setq ss (ssget "F" (list pt1 pt2)
  46.                              '((-4 . "<not")(0 . "*TEXT,DIMENSION,HATCH")(-4 . "not>"))
  47.                                                                          )
  48.                                         )
  49.                                 (progn
  50.                                         (setq intlist ()
  51.                                                 endata  (ssnamex ss)
  52.                                         )
  53.                                         (foreach x endata
  54.                                                 (foreach y (cdddr x) (setq intlist (cons (cadr y) intlist)))
  55.                                         )
  56.                                         ;;点要排序一下才行,按从开始点的距离来排序
  57.                                         (setq lds (+ 10 (distance pt1 pt2)))
  58.                                         (setq intlist (vl-remove-if-not
  59.                                                                                                         '(lambda (x) (<= (distance x pt1) lds))
  60.                                                                                                         intlist
  61.                                                                                                 )
  62.                                         )
  63.                                         (setq
  64.                                                 intlist (vl-sort intlist
  65.                                                                                         '(lambda (x y)
  66.                                                                                                  (< (distance pt1 x) (distance pt1 y))
  67.                                                                                          )
  68.                                                                                 )
  69.                                         )
  70.                                         ;;这里开始写标注程序
  71.                                         (setq olden (entlast)
  72.                                                 ss    (ssadd)
  73.                                         )
  74.                                         (setq n 0)
  75.                                         (repeat (- (length intlist) 1)
  76.                                                 (setq pts1 (nth n intlist)
  77.                                                         pts2 (nth (1+ n) intlist)
  78.                                                 )
  79.                                                 (if (> (distance pts1 pts2) minsize)
  80.                                                         (ddf_entmakedim pts1 pts2)
  81.                                                 )
  82.                                                 (setq n (1+ n))
  83.                                         )                                ;end repeat
  84.                                         (while        (setq ens (entnext olden))
  85.                                                 (setq ss    (ssadd ens ss)
  86.                                                         olden ens
  87.                                                 )
  88.                                         )
  89.                                         (if(>(getvar"OSMODE")16384)(princ)(setvar"OSMODE"(+(getvar"OSMODE")16384)));;默认关闭捕捉
  90.                                         ;(if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(princ));默认打开捕捉
  91.                                         ;;下面开始来移动
  92.                                         (setq loop t);;;带捕捉的grread框架开始
  93.                                         (while loop                                       
  94.                                                 (setq gr (grread t 15 0) code (car gr) ptx (cadr gr))
  95.                                                 (cond
  96.                                                         ((= code 3)(redraw) (setq loop nil))  ; 鼠标左键
  97.                                                         ((= code 5)                           ; 鼠标移动
  98.                                                                 (redraw)
  99.                                                                 (if (>(getvar"OSMODE")16384)
  100.                                                                         (princ)
  101.                                                                         (setq ptx (osnappt nil ptx))
  102.                                                                 )        
  103.                                                                 ;;根据获取的动态点坐标更新程序-开始
  104.                                                                 (setq i 0)
  105.                                                                 (repeat (sslength ss)
  106.                                                                         (setq endata (entget (ssname ss i)))
  107.                                                                         (entmod (subst (cons 10 ptx) (assoc 10 endata) endata))
  108.                                                                         (setq i (1+ i))
  109.                                                                 ); end repeat               
  110.                                                                 ;;根据获取的动态点坐标更新程序-结束
  111.                                                         )
  112.                                                         ((member code '(2 6))                ; 键盘输入--"F3"键
  113.                                                                 (if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(setvar"OSMODE"(+(getvar"OSMODE")16384))));切换捕捉开关
  114.                                                         ;((= code 2)                         ; 键盘输入
  115.                                                         ;        (princ "\n键盘输入=")(princ pt))
  116.                                                         ((member code '(11 25)); 鼠标右击
  117.                                                                 (redraw)  (setq loop nil)
  118.                                                         )
  119.                                                 )
  120.                                         );end while;;;;;带捕捉的grread框架结束
  121.                                 )
  122.                         )                                        ;end if
  123.                 );end progn
  124.         )                                        ;end if
  125.         (princ "\n标注完成")
  126. (YY_END_YY)
  127.         (command "undo" "END")
  128.         (prin1)
  129. )                                        ;end
  130. (defun ddf_entmakedim (pt1 pt2 /)
  131.         (cond
  132.                 ((or (equal 0 (angle pt1 pt2) 0.001)
  133.                          (equal pi (angle pt1 pt2) 0.001)
  134.                  )
  135.                         (entmake
  136.                                 (list
  137.                                         '(0 . "DIMENSION")
  138.                                         '(100 . "AcDbEntity")
  139.                                         '(100 . "AcDbDimension")
  140.                                         (cons 10 pt1)
  141.                                         '(70 . 32)
  142.                                         '(1 . "")
  143.                                         '(100 . "AcDbAlignedDimension")
  144.                                         (cons 13 pt1)
  145.                                         (cons 14 pt2)
  146.                                         '(100 . "AcDbRotatedDimension")
  147.                                 )
  148.                         )
  149.                 )
  150.                 ((or (equal (/ pi 2) (angle pt1 pt2) 0.001)
  151.                          (equal (* pi 1.5) (angle pt1 pt2) 0.001)
  152.                  )
  153.                         (entmake
  154.                                 (list
  155.                                         '(0 . "DIMENSION")
  156.                                         '(100 . "AcDbEntity")
  157.                                         '(100 . "AcDbDimension")
  158.                                         (cons 10 pt1)
  159.                                         '(70 . 33)
  160.                                         '(1 . "")
  161.                                         '(100 . "AcDbAlignedDimension")
  162.                                         (cons 13 pt1)
  163.                                         (cons 14 pt2)
  164.                                 )
  165.                         )
  166.                 )
  167.                 ((and (null (equal 0 (angle pt1 pt2) 0.001))
  168.                          (null (equal (/ pi 2) (angle pt1 pt2) 0.001))
  169.                  )
  170.                         (entmake
  171.                                 (list
  172.                                         '(0 . "DIMENSION")
  173.                                         '(100 . "AcDbEntity")
  174.                                         '(100 . "AcDbDimension")
  175.                                         (cons 10 pt1)
  176.                                         '(70 . 33)
  177.                                         '(1 . "")
  178.                                         '(100 . "AcDbAlignedDimension")
  179.                                         (cons 13 pt1)
  180.                                         (cons 14 pt2)
  181.                                 )
  182.                         )
  183.                 )
  184.         )                                        ;end cond
  185. )                                        ;end
  186. (prin1)
  187. ;;; grread捕捉子函数
  188. (defun osnappt (name pt / color d h k lst nearpt nearpt2 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x)
  189.         (if name (entdel name))
  190.         (redraw)
  191.         (if (< (getvar "osmode") 16384);;打开捕捉
  192.                 (progn
  193.                         (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences (vlax-get-acad-object))))
  194.                                 h (/ (getvar "viewsize") (cadr (getvar "screensize"))) d (getvar "pickbox")
  195.                                 lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 1.5 d h))
  196.                         (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT"))(setq osmo 1))
  197.                         (if (and(setq nearpt2 (osnap pt "_NEA"))(not (equal nearpt nearpt2 k)))
  198.                                 (setq osmo 2 nearpt nearpt2))
  199.                         (if (and(setq nearpt2 (osnap pt "_MID"))(equal nearpt nearpt2 k))
  200.                                 (setq osmo 3 nearpt nearpt2))
  201.                         (if (and(setq nearpt2 (osnap pt "_INT"))(equal nearpt nearpt2 k))
  202.                                 (setq osmo 4 nearpt nearpt2))))
  203.         (if name(entdel name))
  204.         (if nearpt
  205.                 (progn
  206.                         (setq ptx (car nearpt)pty (cadr nearpt))
  207.                         (foreach x lst
  208.                                 (setq pt1 (list (- ptx x) (- pty x)) pt2 (list (+ ptx x) (- pty x))
  209.                                         pt3 (list (+ ptx x) (+ pty x)) pt4 (list (- ptx x) (+ pty x))
  210.                                         pt5 (list ptx (+ pty x)))
  211.                                 (cond
  212.                                         ((= osmo 1)(grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1)))
  213.                                         ((= osmo 2)(grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1)))
  214.                                         ((= osmo 3) (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1)))
  215.                                         ((= osmo 4) (grvecs (list color pt1 pt3 color pt2 pt4)))))
  216.                         (setq pt nearpt)))
  217.         pt
  218. )


回复

使用道具 举报

 楼主| 发表于 2024-9-27 11:31:04 | 显示全部楼层

非常感谢,试验了下,文字填充尺寸都能够过滤,但是如果是块里的文字填充尺寸,还是不能过滤。
回复

使用道具 举报

发表于 2024-9-27 14:07:51 | 显示全部楼层
本帖最后由 qazxswk 于 2024-9-27 14:32 编辑

那就把块也过滤了。
回复

使用道具 举报

发表于 2024-9-27 19:45:53 | 显示全部楼层
增加了过滤块的功能。


  1. (defun C:LXBZ (/ minsize          pt1         pt2        ss     intlist
  2.                                                         x            y           lds          olden         pts1        pts2   n      ens
  3.                                                         code   i           ptx          endata
  4.                                                 )
  5. (prompt "【快速拉线标注,产生交点的位置都会被认为是标注点】")
  6. (setvar "CMDECHO" 0)
  7. (YY_KAISHI_YY)      
  8.   (if ddf_old_minsize
  9.     (setq minsize ddf_old_minsize)
  10.   )
  11.         (command "undo" "be")
  12.   (if
  13.     (progn (initget "S")
  14.                         (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  15.     )
  16.                 (progn
  17.                         (while (= "S" pt1)
  18.                                 (if (null ddf_old_minsize)
  19.                                         (setq minsize (getdist "\n请输入过滤尺寸,默认为<5mm>"))
  20.                                         (setq minsize (getdist        (strcat        "\n请输入过滤尺寸,上次输入为<"
  21.                                                                                                                                                                         (rtos ddf_old_minsize 2 2)
  22.                                                                                                                                                                         "mm>"
  23.                                                                                                                                                                 )
  24.                                                                                                 )
  25.                                         )
  26.                                 )
  27.                                 (if (null minsize)
  28.                                         (setq minsize 5)
  29.                                 )
  30.                                 (setq ddf_old_minsize minsize)
  31.                                 (initget "S")
  32.                                 (setq pt1 (getpoint "\n指定标注起始方向/设置过滤尺寸(S)"))
  33.                         )                                        ;end while
  34.                         (if (null minsize)
  35.                                 (setq minsize 5)
  36.                         )
  37.                         (setq ddf_old_minsize minsize)
  38.                         (setq pt2 (getpoint pt1 "\n指定标注方向"))
  39.                         (if (and pt1 pt2)
  40.                                 (progn
  41.                                         (setq pt1(polar pt1 (angle pt2 pt1) minsize))
  42.                                         (setq pt2(polar pt2 (angle pt1 pt2) minsize))                              
  43.                                 )                       
  44.                         )
  45.                         (if (setq ss (ssget "F" (list pt1 pt2)
  46.                              '((-4 . "<not")(0 . "*TEXT,DIMENSION,HATCH,INSERT")(-4 . "not>"))
  47.                                                                          )
  48.                                         )
  49.                                 (progn
  50.                                         (setq intlist ()
  51.                                                 endata  (ssnamex ss)
  52.                                         )
  53.                                         (foreach x endata
  54.                                                 (foreach y (cdddr x) (setq intlist (cons (cadr y) intlist)))
  55.                                         )
  56.                                         ;;点要排序一下才行,按从开始点的距离来排序
  57.                                         (setq lds (+ 10 (distance pt1 pt2)))
  58.                                         (setq intlist (vl-remove-if-not
  59.                                                                                                         '(lambda (x) (<= (distance x pt1) lds))
  60.                                                                                                         intlist
  61.                                                                                                 )
  62.                                         )
  63.                                         (setq
  64.                                                 intlist (vl-sort intlist
  65.                                                                                         '(lambda (x y)
  66.                                                                                                  (< (distance pt1 x) (distance pt1 y))
  67.                                                                                          )
  68.                                                                                 )
  69.                                         )
  70.                                         ;;这里开始写标注程序
  71.                                         (setq olden (entlast)
  72.                                                 ss    (ssadd)
  73.                                         )
  74.                                         (setq n 0)
  75.                                         (repeat (- (length intlist) 1)
  76.                                                 (setq pts1 (nth n intlist)
  77.                                                         pts2 (nth (1+ n) intlist)
  78.                                                 )
  79.                                                 (if (> (distance pts1 pts2) minsize)
  80.                                                         (ddf_entmakedim pts1 pts2)
  81.                                                 )
  82.                                                 (setq n (1+ n))
  83.                                         )                                ;end repeat
  84.                                         (while        (setq ens (entnext olden))
  85.                                                 (setq ss    (ssadd ens ss)
  86.                                                         olden ens
  87.                                                 )
  88.                                         )
  89.                                         (if(>(getvar"OSMODE")16384)(princ)(setvar"OSMODE"(+(getvar"OSMODE")16384)));;默认关闭捕捉
  90.                                         ;(if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(princ));默认打开捕捉
  91.                                         ;;下面开始来移动
  92.                                         (setq loop t);;;带捕捉的grread框架开始
  93.                                         (while loop                                       
  94.                                                 (setq gr (grread t 15 0) code (car gr) ptx (cadr gr))
  95.                                                 (cond
  96.                                                         ((= code 3)(redraw) (setq loop nil))  ; 鼠标左键
  97.                                                         ((= code 5)                           ; 鼠标移动
  98.                                                                 (redraw)
  99.                                                                 (if (>(getvar"OSMODE")16384)
  100.                                                                         (princ)
  101.                                                                         (setq ptx (osnappt nil ptx))
  102.                                                                 )        
  103.                                                                 ;;根据获取的动态点坐标更新程序-开始
  104.                                                                 (setq i 0)
  105.                                                                 (repeat (sslength ss)
  106.                                                                         (setq endata (entget (ssname ss i)))
  107.                                                                         (entmod (subst (cons 10 ptx) (assoc 10 endata) endata))
  108.                                                                         (setq i (1+ i))
  109.                                                                 ); end repeat               
  110.                                                                 ;;根据获取的动态点坐标更新程序-结束
  111.                                                         )
  112.                                                         ((member code '(2 6))                ; 键盘输入--"F3"键
  113.                                                                 (if(>(getvar"OSMODE")16384)(setvar"OSMODE"(-(getvar"OSMODE")16384))(setvar"OSMODE"(+(getvar"OSMODE")16384))));切换捕捉开关
  114.                                                         ;((= code 2)                         ; 键盘输入
  115.                                                         ;        (princ "\n键盘输入=")(princ pt))
  116.                                                         ((member code '(11 25)); 鼠标右击
  117.                                                                 (redraw)  (setq loop nil)
  118.                                                         )
  119.                                                 )
  120.                                         );end while;;;;;带捕捉的grread框架结束
  121.                                 )
  122.                         )                                        ;end if
  123.                 );end progn
  124.         )                                        ;end if
  125.         (princ "\n标注完成")
  126. (YY_END_YY)
  127.         (command "undo" "END")
  128.         (prin1)
  129. )                                        ;end
  130. (defun ddf_entmakedim (pt1 pt2 /)
  131.         (cond
  132.                 ((or (equal 0 (angle pt1 pt2) 0.001)
  133.                          (equal pi (angle pt1 pt2) 0.001)
  134.                  )
  135.                         (entmake
  136.                                 (list
  137.                                         '(0 . "DIMENSION")
  138.                                         '(100 . "AcDbEntity")
  139.                                         '(100 . "AcDbDimension")
  140.                                         (cons 10 pt1)
  141.                                         '(70 . 32)
  142.                                         '(1 . "")
  143.                                         '(100 . "AcDbAlignedDimension")
  144.                                         (cons 13 pt1)
  145.                                         (cons 14 pt2)
  146.                                         '(100 . "AcDbRotatedDimension")
  147.                                 )
  148.                         )
  149.                 )
  150.                 ((or (equal (/ pi 2) (angle pt1 pt2) 0.001)
  151.                          (equal (* pi 1.5) (angle pt1 pt2) 0.001)
  152.                  )
  153.                         (entmake
  154.                                 (list
  155.                                         '(0 . "DIMENSION")
  156.                                         '(100 . "AcDbEntity")
  157.                                         '(100 . "AcDbDimension")
  158.                                         (cons 10 pt1)
  159.                                         '(70 . 33)
  160.                                         '(1 . "")
  161.                                         '(100 . "AcDbAlignedDimension")
  162.                                         (cons 13 pt1)
  163.                                         (cons 14 pt2)
  164.                                 )
  165.                         )
  166.                 )
  167.                 ((and (null (equal 0 (angle pt1 pt2) 0.001))
  168.                          (null (equal (/ pi 2) (angle pt1 pt2) 0.001))
  169.                  )
  170.                         (entmake
  171.                                 (list
  172.                                         '(0 . "DIMENSION")
  173.                                         '(100 . "AcDbEntity")
  174.                                         '(100 . "AcDbDimension")
  175.                                         (cons 10 pt1)
  176.                                         '(70 . 33)
  177.                                         '(1 . "")
  178.                                         '(100 . "AcDbAlignedDimension")
  179.                                         (cons 13 pt1)
  180.                                         (cons 14 pt2)
  181.                                 )
  182.                         )
  183.                 )
  184.         )                                        ;end cond
  185. )                                        ;end
  186. (prin1)
  187. ;;; grread捕捉子函数
  188. (defun osnappt (name pt / color d h k lst nearpt nearpt2 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x)
  189.         (if name (entdel name))
  190.         (redraw)
  191.         (if (< (getvar "osmode") 16384);;打开捕捉
  192.                 (progn
  193.                         (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences (vlax-get-acad-object))))
  194.                                 h (/ (getvar "viewsize") (cadr (getvar "screensize"))) d (getvar "pickbox")
  195.                                 lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 1.5 d h))
  196.                         (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT"))(setq osmo 1))
  197.                         (if (and(setq nearpt2 (osnap pt "_NEA"))(not (equal nearpt nearpt2 k)))
  198.                                 (setq osmo 2 nearpt nearpt2))
  199.                         (if (and(setq nearpt2 (osnap pt "_MID"))(equal nearpt nearpt2 k))
  200.                                 (setq osmo 3 nearpt nearpt2))
  201.                         (if (and(setq nearpt2 (osnap pt "_INT"))(equal nearpt nearpt2 k))
  202.                                 (setq osmo 4 nearpt nearpt2))))
  203.         (if name(entdel name))
  204.         (if nearpt
  205.                 (progn
  206.                         (setq ptx (car nearpt)pty (cadr nearpt))
  207.                         (foreach x lst
  208.                                 (setq pt1 (list (- ptx x) (- pty x)) pt2 (list (+ ptx x) (- pty x))
  209.                                         pt3 (list (+ ptx x) (+ pty x)) pt4 (list (- ptx x) (+ pty x))
  210.                                         pt5 (list ptx (+ pty x)))
  211.                                 (cond
  212.                                         ((= osmo 1)(grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1)))
  213.                                         ((= osmo 2)(grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1)))
  214.                                         ((= osmo 3) (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1)))
  215.                                         ((= osmo 4) (grvecs (list color pt1 pt3 color pt2 pt4)))))
  216.                         (setq pt nearpt)))
  217.         pt
  218. )


回复

使用道具 举报

 楼主| 发表于 2024-9-27 23:31:11 来自手机 | 显示全部楼层
谢谢,块我还是不过滤了,有时候需要天花灯具定位
回复

使用道具 举报

发表于 2024-9-27 23:47:14 | 显示全部楼层
那就是无解了
回复

使用道具 举报

发表于 2024-10-12 13:30:31 | 显示全部楼层

老大,想咨询个下,这个拉线标注,有时候有一个标注的字样式会在反的方向,正常是在左,有时候有1个会在右边,有试了好多,应该不是标注生产和移动那边的,我估计是点那边,碰到重叠的线的时候会这样。这个有没有办法拯救
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 07:25 , Processed in 0.213954 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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