明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10317|回复: 47

标注系列【源码】,回馈明经

    [复制链接]
发表于 2012-4-30 16:59:24 | 显示全部楼层 |阅读模式
本帖最后由 ebigsong 于 2012-4-25 21:50 编辑


最近开始学习lisp,感谢明经,给了很大的帮助,发点自己写的源码,主要就是引注,标注,然后生成组。就当做回馈明经的用户吧。高手就不要看了,见笑。


  1. ;;;pn.lsp
  2. ;;;根据选择的出户管,进行标注
  3. ;;;输入:选择出户管,点取标注的点位,输入管道种类,编号
  4. ;;;输出:出户管标注
  5. ;;;最后编辑时间:2012.4.8

  6. (defun *error* (msg)  exit)
  7. (defun C:pn()
  8. (setq r 500) ;设置标注圆直径
  9. (setq pn_layer "W_DIM");设置标注图层
  10.    (setq txt_style "hztxt");设置标注样式
  11.    (setq g_yesorno 1);设置是否编组,0-不编组,1-编组
  12.    (setq u_yesorno 0);设置是否将编号大写,0-否,1-大写
  13. (setq txt_size (* r 0.6)) ;设置标注文字高度
  14. (setq txt_off1 (/ r 8)) ;设置标注文字上移尺寸
  15. (setq txt_off2 (/ r 4)) ;设置标注文字下移移动尺寸
  16.   
  17. (setvar"cmdecho"0)
  18. (setq var_os (getvar "osmode"));记录捕捉
  19. (setq var_old_layer (getvar "clayer"));记录当前图层

  20. ;判断图层是否存在
  21. (if (= nil (tblsearch "layer" pn_layer)) (command "layer" "m" pn_layer ""))
  22. ;提示选择出户管,获得选择点
  23. (setq inspt (osnap (cadr (entsel "\n选择出户管")) "nea"))
  24. (while inspt
  25.     (progn
  26.      (setvar "clayer" pn_layer);设置当前图层
  27.    (setvar "osmode" 0);取消捕捉
  28.    
  29.    ;插入出户标注圆
  30.    (command "circle" inspt r)
  31.    ;选择最后一个图元名
  32.    (setq obj_c (entlast))
  33.    ;移动出户标注图块pn_b.dwg
  34.    (command "move" obj_c "" inspt pause)
  35.    
  36.    ;获取第二次输入的点
  37.    (setq inspt1 (getvar 'lastpoint))
  38.    ;绘制连接线
  39.    (setq ang (*  (/ (angle inspt inspt1) pi) 180))
  40.    (setq dis (- (distance inspt1 inspt) r))
  41.    ;连接字符串
  42.    (command "line" inspt (strcat "@" (rtos dis) "<" (rtos ang)) "")
  43.    (setq obj_line (entlast))

  44.    ;绘制圆的分隔线
  45.    (command "line" inspt1 (strcat "@" (rtos (* r 2)) ",0") "")
  46.    (setq obj_line2 (entlast))
  47.    (command "move" obj_line2 "" inspt1 (strcat "@-" (rtos r) ",0"))
  48.    
  49.    ;提示输入出户管标志,自动转成大写
  50.    (setq txt_name (getstring "\n出户管名称: "))
  51.      (if (/= u_yesorno 0)
  52.     (setq txt_name (strcase txt_name))
  53.      )
  54.    ;提示输入出户管编号
  55.    (setq txt_no (getint "\n出户管编号: "))

  56.    ;输入名称和编号
  57.    (command "text" "J" "bc" inspt1 txt_size "0" txt_name)
  58.    ;选择最后一个图元名
  59.    (setq obj_na (entlast))
  60.    (command "move" obj_na "" inspt1 (strcat "@0," (rtos txt_off1)))

  61.    (command "text" "J" "tc" inspt1 txt_size "0" txt_no)
  62.    ;选择最后一个图元名
  63.    (setq obj_no (entlast))
  64.    (command "move" obj_no "" inspt1 (strcat "@0,-" (rtos txt_off2)))

  65.    (if (= g_yesorno 1) ;编组
  66.       (progn
  67.        (setq obj_together (ssadd obj_no (ssadd obj_na (ssadd obj_line2 (ssadd obj_c (ssadd obj_line))))))
  68.        ;生成匿名组
  69.        (command "-group" "c" "*" "出户管标注" obj_together "")
  70.       )
  71.      )
  72.    
  73.    (setvar "osmode" var_os);恢复捕捉
  74.    (setvar "clayer" var_old_layer);恢复当前图层
  75.    (princ)
  76.    ;提示选择出户管,获得选择点
  77.    (setq inspt (osnap (cadr (entsel "\n选择出户管")) "nea"))
  78.    
  79.   );end progn
  80.    
  81. );end while
  82.   (princ)
  83. )




  1. ;;;pn1.lsp
  2. ;;;为选择的对象添加带圈的编号
  3. ;;;输入:选择对象,点取编号点,输入编号
  4. ;;;输出:生成带圈的编号
  5. ;;;2012.4.8
  6. (defun *error* (msg)  exit)
  7. (defun C:pn1()
  8. (setq r 600) ;设置标注圆直径
  9. (setq pn_layer "W_DIM");设置标注图层
  10.    (setq txt_style "hztxt");设置标注样式
  11.    (setq g_yesorno 1);设置是否编组
  12. (setq txt_size (/ r 1.5)) ;设置标注文字高度
  13.   
  14. (setvar"cmdecho"0)
  15. (setq var_os (getvar "osmode"));记录捕捉
  16. (setq var_old_layer (getvar "clayer"));记录当前图层
  17.   
  18. ;判断图层是否存在
  19. (if (= nil (tblsearch "layer" pn_layer)) (command "layer" "m" pn_layer ""))
  20. ;提示选择出户管,获得选择点
  21. (setq inspt (osnap (cadr (entsel "\n选择标注点")) "nea"))
  22. (while inspt
  23.     (progn
  24.      (setvar "clayer" pn_layer);设置当前图层
  25.    (setvar "osmode" 0);取消捕捉
  26.    
  27.    ;插入标注圆
  28.    (command "circle" inspt r)
  29.    ;选择最后一个图元名
  30.    (setq obj_c (entlast))
  31.    ;移动标注圆
  32.    (command "move" obj_c "" inspt pause)
  33.    ;获取第二次输入的点
  34.    (setq inspt1 (getvar 'lastpoint))
  35.    ;绘制连接线
  36.    (setq ang (*  (/ (angle inspt inspt1) pi) 180))
  37.    (setq dis (- (distance inspt1 inspt) r))
  38.    ;连接字符串
  39.    (command "line" inspt (strcat "@" (rtos dis) "<" (rtos ang)) "")
  40.    (setq obj_line (entlast))
  41.    ;提示输入编号
  42.    (setq txt_name (getstring "\n编号: "))
  43.    ;输入编号
  44.    (command "text" "J" "mc" inspt1 txt_size "0" txt_name)
  45.    ;选择最后一个图元名
  46.    (setq obj_na (entlast))
  47.    (if (= g_yesorno 1) ;编组
  48.       (progn
  49.        (setq obj_together (ssadd obj_na  (ssadd obj_c (ssadd obj_line))))
  50.        ;生成匿名组
  51.        (command "-group" "c" "*" "引注" obj_together "")
  52.       )
  53.      )
  54.    (setvar "osmode" var_os);恢复捕捉
  55.    (setvar "clayer" var_old_layer);恢复当前图层
  56.    (princ)
  57.    ;提示选择对象
  58.    (setq inspt (osnap (cadr (entsel "\n选择标注点")) "nea"))
  59.    
  60.   );end progn
  61.    
  62. );end while

  63. (princ)
  64. )


  1. ;;;pn2.lsp
  2. ;;;从选择的点引出带圈的编号
  3. ;;;输入:选择引出点,选择标注点,输入编号
  4. ;;;输出:从引出点带圈的编号


  5. (defun *error* (msg)  exit)
  6. (defun C:pn2()

  7.   (setq r 600) ;设置标注圆直径
  8.   (setq pn_layer "W_DIM");设置标注图层
  9.     (setq txt_style "hztxt");设置标注样式
  10.     (setq g_yesorno 1);设置是否编组

  11.   (setq txt_size (/ r 1.5)) ;设置标注文字高度

  12.   (setvar"cmdecho"0)

  13.   (setq var_os (getvar "osmode"));记录捕捉
  14.   (setq var_old_layer (getvar "clayer"));记录当前图层
  15.   

  16.   ;判断图层是否存在
  17.   (if (= nil (tblsearch "layer" pn_layer)) (command "layer" "m" pn_layer ""))

  18.   ;提示选择出户管,获得选择点
  19.   (setq inspt (getpoint "\n选择标注点"))

  20.   (while inspt
  21.       (progn
  22.         (setvar "clayer" pn_layer);设置当前图层
  23.       (setvar "osmode" 0);取消捕捉
  24.       
  25.       ;插入出户标注圆
  26.       (command "circle" inspt r)
  27.       ;选择最后一个图元名
  28.       (setq obj_c (entlast))

  29.       ;移动出户标注图块pn_b.dwg
  30.       (command "move" obj_c "" inspt pause)

  31.       ;获取第二次输入的点
  32.       (setq inspt1 (getvar 'lastpoint))

  33.       ;绘制连接线
  34.       (setq ang (*  (/ (angle inspt inspt1) pi) 180))
  35.       (setq dis (- (distance inspt1 inspt) r))

  36.       ;连接字符串
  37.       (command "line" inspt (strcat "@" (rtos dis) "<" (rtos ang)) "")
  38.       (setq obj_line (entlast))

  39.       ;提示输入编号
  40.       (setq txt_name (getstring "\n编号: "))

  41.       ;输入编号
  42.       (command "text" "J" "mc" inspt1 txt_size "0" txt_name)
  43.       ;选择最后一个图元名
  44.       (setq obj_na (entlast))
  45.    
  46.       (if (= g_yesorno 1) ;编组
  47.           (progn
  48.             (setq obj_together (ssadd obj_na  (ssadd obj_c (ssadd obj_line))))

  49.             ;生成匿名组
  50.             (command "-group" "c" "*" "引注" obj_together "")
  51.           )
  52.         )

  53.       (setvar "osmode" var_os);恢复捕捉
  54.       (setvar "clayer" var_old_layer);恢复当前图层
  55.       (princ)

  56.       ;提示选择出户管,获得选择点
  57.       (setq inspt (getpoint "\n选择标注点"))
  58.       
  59.     );end progn
  60.    
  61.   );end while

  62.   (princ)

  63. )




  1. ;;;pn3.lsp
  2. ;;;给选择的对象添加文字标注
  3. ;;;输入:选择对象和标注的点位,输入标注文字
  4. ;;;输出:生成引线及标注文字。
  5. ;;;最后修改时间:2012.4.8
  6. ;(defun *error* (msg)  exit)
  7. (defun C:pn3()
  8.   
  9. (setq r 50)
  10. (setq lg_layer "W_DIM");设置标注图层
  11.    (setq txt_style "hztxt");立管标注样式
  12.    (setq g_yesorno 1);设置是否编组,0-不编组,1-编组
  13. (setq txt_size (* r 6)) ;设置标注文字高度
  14. (setq txt_off1 (* r 1)) ;设置标注文字上移尺寸
  15.    (setq txt_off2 (* r 2)) ;设置标注文字左右移尺寸
  16.   
  17. (setvar"cmdecho"0)
  18. (setq var_os (getvar "osmode"));记录捕捉
  19. (setq var_old_layer (getvar "clayer"));记录当前图层

  20. ;判断图层是否存在
  21. (if (= nil (tblsearch "layer" lg_layer)) (command "layer" "m" lg_layer ""))
  22.    ;提示选择对象,获得选择点
  23. (setq inspt (osnap (cadr (entsel "\n选择标注对象")) "nea"))

  24. (while inspt
  25.     (progn
  26.      (setvar "clayer" lg_layer);设置当前图层
  27.      (setvar "osmode" 0);取消捕捉
  28.    
  29.      (setq inspt1 (getpoint inspt "\n点取标注位置"))

  30.    ;绘制连接线
  31.    (command "line" inspt inspt1 "")
  32.    (setq obj_line (entlast))
  33.      (setq txt (getstring "\n标注内容: "))
  34.    
  35.       
  36.    (setq ang (*  (/ (angle inspt inspt1) pi) 180))
  37.      (if (or (<= ang 90) (>= ang 270))
  38.      (progn
  39.       
  40.      ;输入名称和编号
  41.     (command "text" "J" "bl" inspt1 txt_size "0" txt)
  42.     ;选择最后一个图元名
  43.     (setq obj_txt (entlast))
  44.     (command "move" obj_txt "" inspt1 (strcat "@" (rtos txt_off2) "," (rtos txt_off1)))
  45.       
  46.     ;绘制标注底线
  47.         (setq txtb (textbox (entget obj_txt)))
  48.     ;得到文字长度
  49.     (setq txt_l (- (caadr txtb) (caar txtb)))
  50.     (command "line" inspt1 (strcat "@" (rtos (+ txt_l (* txt_off2 2))) ",0") "")
  51.     (setq obj_line2 (entlast))
  52.        )   
  53.      
  54.      (progn
  55.       
  56.      ;输入名称和编号
  57.     (command "text" "J" "br" inspt1 txt_size "0" txt)
  58.     ;选择最后一个图元名
  59.     (setq obj_txt (entlast))
  60.     (command "move" obj_txt "" inspt1 (strcat "@-" (rtos txt_off2) "," (rtos txt_off1)))
  61.       
  62.         ;绘制标注底线
  63.         (setq txtb (textbox (entget obj_txt)))
  64.     ;得到文字长度
  65.     (setq txt_l (- (caadr txtb) (caar txtb)))
  66.         
  67.     (command "line" inspt1 (strcat "@-" (rtos (+ txt_l (* txt_off2 2))) ",0") "")
  68.     (setq obj_line2 (entlast))
  69.        )
  70.      
  71.      )

  72.    (if (= g_yesorno 1) ;编组
  73.       (progn
  74.        ;建立选择集
  75.        (setq obj_together (ssadd obj_txt (ssadd obj_line2 (ssadd obj_line))))
  76.        ;生成匿名组
  77.        (command "-group" "c" "*" "对象标注" obj_together "")
  78.       )
  79.      )
  80.    (setvar "osmode" var_os);恢复捕捉
  81.    (setvar "clayer" var_old_layer);恢复当前图层
  82.    (princ)
  83.      ;提示选择对象,获得选择点
  84.    (setq inspt (osnap (cadr (entsel "\n选择标注对象")) "nea"))

  85.   );end progn
  86.    
  87. );end while
  88.   (princ)
  89. )



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

不错  发表于 2015-4-24 16:51

评分

参与人数 1明经币 +1 金钱 +15 收起 理由
【KAIXIN】 + 1 + 15 赞一个!

查看全部评分

发表于 2019-9-24 20:57:21 | 显示全部楼层
text 改用 entmakex 之后
;绘制标注底线
  (setq txtb (textbox (entget obj_txt)))  
就出错。

  1. (defun C:pn3()
  2. (setq scale (getvar "dimscale"))  ;获得全局比例
  3. ;;;(setq lg_layer "W_DIM");设置标注图层
  4. ;;; (setq txt_style "hztxt");立管标注样式
  5. (setq g_yesorno 1);设置是否编组,0-不编组,1-编组
  6. ;;;(setq txt_size (* scale 6)) ;设置标注文字高度
  7. (setq txt_off1 (* scale 1)) ;设置标注文字上移尺寸
  8. (setq txt_off2 (* scale 2)) ;设置标注文字左右移尺寸
  9. (setvar"cmdecho"0)
  10. (setq var_os (getvar "osmode"));记录捕捉
  11. (setq var_old_layer (getvar "clayer"));记录当前图层
  12. ;判断图层是否存在
  13. ;;;(if (= nil (tblsearch "layer" lg_layer)) (command "layer" "m" lg_layer ""))
  14. ;提示选择对象,获得选择点
  15. (setq inspt (osnap (cadr (entsel "\n选择标注对象")) "nea"))
  16. (while inspt
  17.   (progn
  18. ;;; (setvar "clayer" lg_layer);设置当前图层
  19. (setvar "osmode" 0);取消捕捉
  20. (setq inspt1 (getpoint inspt "\n点取标注位置"))
  21. ;绘制连接线
  22. (command "line" inspt inspt1 "")
  23. (setq obj_line (entlast))
  24. (setq txt_name (getstring "\n标注内容: "))
  25. (setq ang (*(/ (angle inspt inspt1) pi) 180))
  26. (if (or (<= ang 90) (>= ang 270))
  27. (progn
  28. ;输入名称和编号
  29. ;;;  (command "text" "J" "bl" inspt1 txt_size "0" txt_name)
  30. (entmakeX (list '(0 . "MTEXT")
  31.                                                 '(100 . "AcDbEntity")
  32.                                                 '(100 . "AcDbMText")
  33.                                                 '(70 . 0)
  34.                                                 '(71 . 7) ;;左对齐-下对齐
  35.                                                 '(72 . 1)
  36.                                                 '(73 . 2)
  37.                                                 (cons 40 (* scale 6))
  38.                                                       (cons 1  txt_name)
  39.                                                 (cons 10 inspt1)                 
  40.                         )
  41.                 )
  42.   
  43.   ;选择最后一个图元名
  44.   (setq obj_txt (entlast))
  45.   (command "move" obj_txt "" inspt1 (strcat "@" (rtos txt_off2) "," (rtos txt_off1)))
  46.   ;绘制标注底线
  47.   (setq txtb (textbox (entget obj_txt)))  ;;;#### 这个如何改?####################
  48.   ;得到文字长度
  49.   (setq txt_l (- (caadr txtb) (caar txtb)))
  50.   (command "line" inspt1 (strcat "@" (rtos (+ txt_l (* txt_off2 2))) ",0") "")
  51.   (setq obj_line2 (entlast))
  52.    )
  53. (progn
  54. ;输入名称和编号
  55. ;;;  (command "text" "J" "br" inspt1 txt_size "0" txt_name)
  56.    (entmakeX (list '(0 . "MTEXT")
  57.                                                 '(100 . "AcDbEntity")
  58.                                                 '(100 . "AcDbMText")
  59.                                                 '(70 . 0)
  60.                                                 '(71 . 9) ; 右对齐-下对齐
  61.                                                 '(72 . 1)
  62.                                                 '(73 . 2)
  63.                                                 (cons 40 (* scale 6))
  64.                                                       (cons 1  txt_name)
  65.                                                 (cons 10 inspt1)                 
  66.                         )
  67.                 )
  68.   ;选择最后一个图元名
  69.   (setq obj_txt (entlast))
  70.   (command "move" obj_txt "" inspt1 (strcat "@-" (rtos txt_off2) "," (rtos txt_off1)))
  71.   ;绘制标注底线
  72.   (setq txtb (textbox (entget obj_txt)))  ;;;#### 这个如何改?####################
  73.   ;得到文字长度
  74.   (setq txt_l (- (caadr txtb) (caar txtb)))
  75.   (command "line" inspt1 (strcat "@-" (rtos (+ txt_l (* txt_off2 2))) ",0") "")
  76.   (setq obj_line2 (entlast))
  77.    )
  78. )
  79. (if (= g_yesorno 1) ;编组
  80.   (progn
  81.    ;建立选择集
  82.    (setq obj_together (ssadd obj_txt (ssadd obj_line2 (ssadd obj_line))))
  83.    ;生成匿名组
  84.    (command "-group" "c" "*" "对象标注" obj_together "")
  85.   )
  86. )
  87. (setvar "osmode" var_os);恢复捕捉
  88. (setvar "clayer" var_old_layer);恢复当前图层
  89. (princ)
  90. ;提示选择对象,获得选择点
  91. (setq inspt (osnap (cadr (entsel "\n选择标注对象")) "nea"))
  92. );end progn
  93. );end while
  94. (princ)
  95. )

发表于 2019-4-22 22:48:31 | 显示全部楼层
很需要这类插件,对工作提供很大便利
非常感谢楼主的无私分享
发表于 2019-10-3 11:56:20 | 显示全部楼层
虽然不同行,还是有用,非常感谢提供源码
发表于 2012-4-30 17:40:40 | 显示全部楼层
感谢楼主分享,下载试用
发表于 2012-4-30 17:44:14 | 显示全部楼层
感谢分享,学习了。
发表于 2012-4-30 18:28:27 | 显示全部楼层
蛮实用的标注程序~
感谢分享~
发表于 2012-4-30 21:46:04 | 显示全部楼层
多谢楼主分享这么好的程序!!!
发表于 2012-4-30 22:01:07 | 显示全部楼层
多谢楼主分享这么好的程序!!!
发表于 2012-5-1 08:37:37 | 显示全部楼层
给排水专业的福音
发表于 2012-5-1 11:01:55 | 显示全部楼层
非常感谢提供源码
发表于 2012-5-1 20:48:54 | 显示全部楼层
虽然不同行,还是有用,非常感谢提供源码
发表于 2012-5-10 09:14:41 | 显示全部楼层
很需要这类插件,对工作提供很大便利
非常感谢楼主的无私分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 01:23 , Processed in 0.223789 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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