找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1748|回复: 16

[原创]:实现标注及文字offset的lisp程序

[复制链接]
发表于 2003-6-6 14:14:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
命令:dt_offset
文字offset,适合写多行文字。例如:技术指标,多层标高等;
标注offset,适合绘制详图中的多道尺寸,因为平移的距离相等,图面上美观一点。


  1.   [FONT=courier new]
  2. ;=====================================
  3. ;获取实体dxf组码内容
  4. ; (lhj_dxf 实体名 dxf码编号)
  5. ;例:(lhj_dxf textname 10),获取文字左下点标

  6. (defun lhj_dxf (ename code / elist res)
  7.   (setq elist (entget ename))
  8.   (setq res (cdr (assoc code elist)))
  9. )
  10. (setq lpi2 (/ pi 2))
  11. ;==========================================
  12. ;初始化,读取系统变量。结束时,恢复系统变量
  13. ;  osmode             0
  14. ;  cmdecho         1
  15. ;  clayer             2
  16. ;  textstyle          3
  17. ;  cecolor        4
  18. ;  dimstyle        5
  19. ;  plinewid    6
  20. ;  filletrad   7


  21. (defun lhj_start ()
  22.   (setq        lhj_s_lst
  23.          (list
  24.            (getvar "osmode")
  25.            (getvar "cmdecho")
  26.            (getvar "clayer")
  27.            (getvar "textstyle")
  28.            (getvar "cecolor")
  29.            (getvar "dimstyle")
  30.            (getvar "plinewid")
  31.            (getvar "filletrad")
  32.          )
  33.   )
  34.   (setq old_error *error*)
  35.   (setvar "cmdecho" 0)
  36.   (command "undo" "be")
  37.   (setvar "osmode" 0)
  38.   (princ)
  39. )


  40. (defun lhj_end ()
  41.   (setvar "osmode" (nth 0 lhj_s_lst))
  42.   (setvar "clayer" (nth 2 lhj_s_lst))
  43.   (setvar "textstyle" (nth 3 lhj_s_lst))
  44.   (setvar "cecolor" (nth 4 lhj_s_lst))
  45.   (command "dimstyle" "r" (nth 5 lhj_s_lst))
  46.   (setvar "plinewid" (nth 6 lhj_s_lst))
  47.   (setvar "filletrad" (nth 7 lhj_s_lst))
  48.   (setq *error* old_error)
  49.   (command "undo" "e")
  50.   (setvar "cmdecho" (nth 1 lhj_s_lst))
  51.   (princ)
  52. )



  53. (defun c:dt_offset (/ dname pt pt10 pt14 ang dlist pint temp loop ali1 pt11 ali2)

  54. ;初始化程序=======
  55.   (lhj_start)

  56.   (defun *error* (msg)
  57.     (princ "\n")
  58.     (princ "\n:::lhj_tools:::")
  59.     (princ msg)
  60.     (princ ",程序退出!")
  61.     (if        dname
  62.       (redraw dname 4)
  63.     )
  64.     (lhj_end)
  65.   )
  66. ;初始化结束=======

  67. ;主程序===========
  68.   (if (not lhj_dodis)
  69.     (setq lhj_dodis 800)
  70.   )
  71.   (princ "\n:::LHJ_TOOLS:::请输入平移距离<")
  72.   (princ lhj_dodis)
  73.   (princ ">:")
  74.   (if (setq temp (getreal))
  75.     (setq lhj_dodis temp)
  76.   )
  77.   (setq loop t)

  78.   (defun do_dim        ()
  79.     (redraw dname 3)
  80.     (setq pt (getpoint "\n:::LHJ_TOOLS:::请点取offset方向:"))
  81.     (redraw dname 4)
  82.     (command "copy" dname "" "0,0" "@")
  83.     (setq dlist (entget (entlast)))
  84.     (if        pt
  85.       (progn
  86.         (setq pt10  (lhj_dxf dname 10)
  87.               pt14  (lhj_dxf dname 14)
  88.               ang   (angle pt14 pt10)
  89.               pint  (inters pt (polar pt (+ ang lpi2) 1000) pt10 pt14 nil)
  90.               ;dlist (entget dname)
  91.               ang   (angle pt10 pint)
  92.               dlist (subst (cons 10 (polar pt10 ang lhj_dodis))
  93.                            (assoc 10 dlist)
  94.                            dlist
  95.                     )
  96.         )
  97.         (entmod dlist)
  98.       )
  99.     )
  100.   )

  101.   (defun do_text ()
  102.     (redraw dname 3)
  103.     (setq pt (getpoint "\n:::LHJ_TOOLS:::请点取offset方向:"))
  104.     (redraw dname 4)
  105.     (if        pt
  106.       (progn
  107.         (setq pt10  (lhj_dxf dname 10)
  108.               pt11  (lhj_dxf dname 11)
  109.               ang   (lhj_dxf dname 50)
  110.               pint  (inters pt
  111.                             (polar pt (+ ang lpi2) 1000)
  112.                             pt10
  113.                             (polar pt10 ang 1000)
  114.                             nil
  115.                     )
  116.               dlist (entget dname)
  117.               ang   (angle pint pt)
  118.               ali1  (lhj_dxf dname 72)
  119.               ali2  (lhj_dxf dname 73)
  120.         )
  121.         (if (and (= ali1 0) (= ali2 0))
  122.           (setq        dlist (subst (cons 10 (polar pt10 ang lhj_dodis))
  123.                              (assoc 10 dlist)
  124.                              dlist
  125.                       )
  126.           )
  127.           (setq        dlist (subst (cons 11 (polar pt11 ang lhj_dodis))
  128.                              (assoc 11 dlist)
  129.                              dlist
  130.                       )
  131.           )
  132.         )
  133.         (entmake dlist)
  134.       )
  135.     )
  136.   )

  137.   (while loop
  138.     (setq
  139.       dname (car (entsel "\n:::LHJ_TOOLS:::请选择要offset的尺寸标注或文字:"))
  140.     )
  141.     (if        dname
  142.       (cond ((= (lhj_dxf dname 0) "DIMENSION") (do_dim))
  143.             ((= (lhj_dxf dname 0) "TEXT") (do_text))
  144.       )
  145.       (setq loop nil)
  146.     )
  147.   )


  148. ;主程序结束=======

  149.   (lhj_end)
  150.   (princ)
  151. )


  152.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-6-7 01:00:06 | 显示全部楼层
干脆把offset能用的实体合进程序里,省的还要用另一个命令.
加了一下
命令 o
  1. [font=courier]
  2. (defun c:o( / dname lhj_dodis loop lpi2 pt temp lhj_start lhj_end do_dim do_text lhj_dxf)
  3. (defun lhj_dxf (ename code / elist res)
  4.   (setq elist (entget ename))
  5.   (setq res (cdr (assoc code elist)))
  6. )
  7. (setq lpi2 (/ pi 2))
  8. ;==========================================
  9. ;初始化,读取系统变量。结束时,恢复系统变量
  10. ;  osmode             0
  11. ;  cmdecho         1
  12. ;  clayer             2
  13. ;  textstyle          3
  14. ;  cecolor        4
  15. ;  dimstyle        5
  16. ;  plinewid    6
  17. ;  filletrad   7


  18. (defun lhj_start ()
  19.   (setq        lhj_s_lst
  20.          (list
  21.            (getvar "osmode")
  22.            (getvar "cmdecho")
  23.            (getvar "clayer")
  24.            (getvar "textstyle")
  25.            (getvar "cecolor")
  26.            (getvar "dimstyle")
  27.            (getvar "plinewid")
  28.            (getvar "filletrad")
  29.          )
  30.   )
  31.   (setq old_error *error*)
  32.   (setvar "cmdecho" 0)
  33.   (command "undo" "be")
  34.   (setvar "osmode" 0)
  35.   (princ)
  36. )


  37. (defun lhj_end ()
  38.   (setvar "osmode" (nth 0 lhj_s_lst))
  39.   (setvar "clayer" (nth 2 lhj_s_lst))
  40.   (setvar "textstyle" (nth 3 lhj_s_lst))
  41.   (setvar "cecolor" (nth 4 lhj_s_lst))
  42.   (command "dimstyle" "r" (nth 5 lhj_s_lst))
  43.   (setvar "plinewid" (nth 6 lhj_s_lst))
  44.   (setvar "filletrad" (nth 7 lhj_s_lst))
  45.   (setq *error* old_error)
  46.   (command "undo" "e")
  47.   (setvar "cmdecho" (nth 1 lhj_s_lst))
  48.    (setq lhj_s_lst nil)
  49.   (princ)
  50. )



  51.   (defun do_dim        ( / ang dlist pint pt10 pt14)
  52.     (command "copy" dname "" "0,0" "@")
  53.     (setq dlist (entget (entlast)))
  54.         (setq pt10  (lhj_dxf dname 10)
  55.               pt14  (lhj_dxf dname 14)
  56.               ang   (angle pt14 pt10)
  57.               pint  (inters pt (polar pt (+ ang lpi2) 1000) pt10 pt14 nil)
  58.               ang   (angle pt10 pint)
  59.               dlist (subst (cons 10 (polar pt10 ang lhj_dodis))
  60.                            (assoc 10 dlist)
  61.                            dlist
  62.                     )
  63.         )
  64.         (entmod dlist)
  65.   )

  66.   (defun do_text ( / ali1 ali2 ang dlist pint pt10 pt11)
  67.         (setq pt10  (lhj_dxf dname 10)
  68.               pt11  (lhj_dxf dname 11)
  69.               ang   (lhj_dxf dname 50)
  70.               pint  (inters pt
  71.                             (polar pt (+ ang lpi2) 1000)
  72.                             pt10
  73.                             (polar pt10 ang 1000)
  74.                             nil
  75.                     )
  76.               dlist (entget dname)
  77.               ang   (angle pint pt)
  78.               ali1  (lhj_dxf dname 72)
  79.               ali2  (lhj_dxf dname 73)
  80.         )
  81.         (if (and (= ali1 0) (= ali2 0))
  82.           (setq        dlist (subst (cons 10 (polar pt10 ang lhj_dodis))
  83.                              (assoc 10 dlist)
  84.                              dlist
  85.                       )
  86.           )
  87.           (setq        dlist (subst (cons 11 (polar pt11 ang lhj_dodis))
  88.                              (assoc 11 dlist)
  89.                              dlist
  90.                       )
  91.           )
  92.         )
  93.         (entmake dlist)
  94.   )

  95. ;初始化程序=======
  96.   (lhj_start)
  97.   (defun *error* (msg)
  98.     (princ "\n")
  99.     (princ "\n:::lhj_tools:::")
  100.     (princ msg)
  101.     (princ ",程序退出!")
  102.     (if        dname
  103.       (redraw dname 4)
  104.     )
  105.     (lhj_end)
  106.   )

  107. ;主程序===========
  108.   (if (not lhj_dodis)
  109.     (setq lhj_dodis 800)
  110.   )
  111.   (princ "\n:::LHJ_TOOLS:::请输入平移距离<")
  112.   (princ lhj_dodis)
  113.   (princ ">:")
  114.   (if (setq temp (getreal))
  115.     (setq lhj_dodis temp)
  116.   )
  117.   (setq loop t)

  118.   

  119.   (while loop
  120.     (if(and (setq dname (car (entsel "\n:::LHJ_TOOLS:::请选择:")))
  121.             (member (lhj_dxf dname 0)'("TEXT""DIMENSION""LINE""LWPOLYLINE""POLYLINE""SPLINE""ARC""CIRCLE""ELLIPSE"))
  122.             (setq pt(getpoint"请点取offset方向:"))
  123.          )
  124.       (progn
  125.        (redraw dname 3)
  126.        (cond ((= (lhj_dxf dname 0) "DIMENSION") (do_dim))
  127.             ((= (lhj_dxf dname 0) "TEXT") (do_text ))
  128.             (t(command"offset" lhj_dodis dname pt ""))  
  129.        )
  130.       (redraw dname 4)
  131.       )
  132.       (setq loop nil)
  133.     )
  134.   )


  135. ;主程序结束=======

  136.   (lhj_end)
  137.   (princ)
  138. )
  139. [/font]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-8 21:18:03 | 显示全部楼层
多谢aeo兄鼓励及补充!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-19 18:32:06 | 显示全部楼层
文字和标注用move也可以阿
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-20 13:12:27 | 显示全部楼层
斜的文字呢?
标注offset后,与原标注的标记点位置是相同的,:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-20 20:52:31 | 显示全部楼层
如果带属性的块也能offset就好了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-20 23:17:10 | 显示全部楼层
加载输入命令显示错误.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-20 23:22:28 | 显示全部楼层
加载输入命令显示错误.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-1 21:41:44 | 显示全部楼层
用了之后,回味无穷呀!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-2 08:52:47 | 显示全部楼层
第二个好,但文本只能上下复制而不能左右复制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-2 10:11:00 | 显示全部楼层
命令太长了,能不能来个方便的短的命令!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-2 18:03:30 | 显示全部楼层
程序没问题
但是只可以向垂直方向偏至可以自主输入角度吗
我觉得那样更好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-2 23:05:50 | 显示全部楼层
对于标注,一次可偏移多个是不是更好点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-3 08:19:32 | 显示全部楼层
最好能做到框选尺寸,自动等分间距就好了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-3 10:44:49 | 显示全部楼层
为什么每次偏移距离都是 800 ,最好是上次输入的值
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 06:51 , Processed in 0.259430 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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