找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 959|回复: 2

[原创]:标注打断

[复制链接]
发表于 2003-2-25 20:48:19 | 显示全部楼层 |阅读模式

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

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

×
共有两个命令
bb1:点取多个点,打断标注,忽略不和标注线垂直相交的点。
bb2:选取多个直线,过直线起点,打断标注。

  1.   [FONT=courier new]
  2. ;按过滤列表选择物体
  3. ;fi_list格式: (0 "TYPE" 8 "LAYER" ...)
  4. ;图元类别请大写
  5. (defun lhj_entsel (pro fi_list / n name res)

  6.   (if (setq name (car (entsel pro)))
  7.     (progn
  8.       (setq res        1
  9.             n        (length fi_list)
  10.       )

  11.       (while (> n 0)
  12.         (setq n (- n 2))
  13.         (if (= (lhj_dxf name (nth n fi_list))
  14.                (nth (1+ n) fi_list)
  15.             )
  16.           (setq res (* res 1))
  17.           (setq res (* res 0))
  18.         )
  19.       )
  20.       (cond ((= res 1) (setq res name))
  21.             ((= res 0) nil)
  22.       )
  23.     )
  24.     (setq res nil)
  25.   )
  26. )



  27. ;获取实体dxf组码内容
  28. ; (lhj_dxf 实体名 dxf码编号)
  29. ;例:(lhj_dxf textname 10),获取文字左下点标

  30. (defun lhj_dxf (ename code / elist res)
  31.   (setq elist (entget ename))
  32.   (setq res (cdr (assoc code elist)))
  33. )

  34. ;==========================================
  35. ;初始化,读取系统变量。结束时,恢复系统变量
  36. ;  osmode             0
  37. ;  cmdecho         1
  38. ;  clayer             2
  39. ;  textstyle          3
  40. ;  cecolor        4
  41. ;  dimstyle        5
  42. ;  plinewid    6


  43. (defun lhj_start ()
  44.   (setq        lhj_s_lst
  45.          (list
  46.            (getvar "osmode")
  47.            (getvar "cmdecho")
  48.            (getvar "clayer")
  49.            (getvar "textstyle")
  50.            (getvar "cecolor")
  51.            (getvar "dimstyle")
  52.            (getvar "plinewid")
  53.          )
  54.   )
  55.   (setq old_error *error*)
  56.   (setvar "osmode" 0)
  57.   (setvar "cmdecho" 0)
  58.   (command "undo" "be")
  59.   (princ)
  60. )


  61. (defun lhj_end ()
  62.   (setvar "osmode" (nth 0 lhj_s_lst))
  63.   (setvar "clayer" (nth 2 lhj_s_lst))
  64.   (setvar "textstyle" (nth 3 lhj_s_lst))
  65.   (setvar "cecolor" (nth 4 lhj_s_lst))
  66.   (command "dimstyle" "r" (nth 5 lhj_s_lst))
  67.   (setvar "plinewid" (nth 6 lhj_s_lst))
  68.   (setq *error* old_error)
  69.   (command "undo" "e")
  70.   (setvar "cmdecho" (nth 1 lhj_s_lst))
  71.   (princ)
  72. )

  73. (setq lhj_pi2 (/ pi 2))

  74. ;求点到直线足

  75. (defun p_to_l (pt0 pt1 pt2 mode / ang)
  76.   (setq ang (angle pt1 pt2))
  77.   (inters pt0
  78.           (polar pt0 (+ ang lhj_pi2) 1000)
  79.           pt1
  80.           pt2
  81.           mode
  82.   )
  83. )

  84. ;去除表中指定元素,返回表
  85. (defun a_ext_li        (a alist / res temp)
  86.   (setq temp (member a alist))
  87.   (if (/= temp nil)
  88.     (setq res (append
  89.                 (reverse (cdr (member a (reverse alist))))
  90.                 (cdr temp)
  91.               )
  92.     )
  93.     (setq res alist)
  94.   )
  95. )


  96. ;求一系列点中到基准点的距离最小点

  97. (defun p_p0_dismin (p0 ptlist / ll pt1 pt2)
  98.   (setq ll (length ptlist))
  99.   (if (> ll 1)
  100.     (progn
  101.       (setq pt1 (nth 0 ptlist))
  102.       (while (> ll 1)
  103.         (setq ll  (1- ll)
  104.               pt2 (nth ll ptlist)
  105.         )
  106.         (if (> (distance pt1 p0) (distance pt2 p0))
  107.           (setq pt1 pt2)
  108.         )
  109.       )
  110.     )
  111.     (setq pt1 (car ptlist))
  112.   )
  113.   (setq res pt1)
  114. )


  115. ;将一系列点按到基准点的距离升序排列

  116. (defun p_p0_disup (p0 ptlist / ll newlist pt1 res)
  117.   (setq        newlist        '()
  118.         ll        (length ptlist)
  119.   )
  120.   (while (> ll 0)
  121.     (setq pt1          (p_p0_dismin p0 ptlist)
  122.           newlist (cons pt1 newlist)
  123.           ptlist  (a_ext_li pt1 ptlist)
  124.           ll          (1- ll)
  125.     )
  126.     (princ pt1)
  127.   )
  128.   (setq res (reverse newlist))
  129. )


  130. ;求标注的另一控点

  131. (defun dim_pt9 (dname / pt13 pt14 pt10 ang)
  132.   (setq        pt13 (lhj_dxf dname 13)
  133.         pt14 (lhj_dxf dname 14)
  134.         pt10 (lhj_dxf dname 10)
  135.         ang  (angle pt14 pt10)
  136.         pt9  (inters
  137.                pt13
  138.                (polar pt13 ang 1000)
  139.                pt10
  140.                (polar pt10 (+ ang lhj_pi2) 1000)
  141.                nil
  142.              )
  143.   )
  144. )


  145. ;将标注打断为两部分,并返回新建标注的实体名
  146. (defun dim_break (pt dname / pt13 pt14 pt10 ang        dlist dlist1 dlist2
  147.                   pt13_1)

  148.   (setq        dlist  (entget dname)
  149.         pt13   (lhj_dxf dname 13)
  150.         pt14   (lhj_dxf dname 14)
  151.         pt10   (lhj_dxf dname 10)
  152.         ang    (angle pt14 pt10)
  153.         pt9    (inters
  154.                  pt13
  155.                  (polar pt13 ang 1000)
  156.                  pt10
  157.                  (polar pt10 (+ ang lhj_pi2) 1000)
  158.                  nil
  159.                )
  160.         pt13_1 (polar pt14 (angle pt10 pt9) (distance pt10 pt))
  161.   )
  162.   (command "copy" dname "" "0,0" "@")
  163.   (setq        dlist1 (subst (cons 14 pt13_1) (assoc 14 dlist) dlist)
  164.         dlist1 (subst (cons 10 pt) (assoc 10 dlist1) dlist1)
  165.   )
  166.   (setq        dlist2 (entget (entlast))
  167.         dlist2 (subst (cons 13 pt13_1) (assoc 13 dlist2) dlist2)
  168.   )
  169.   (entmod dlist1)
  170.   (entmod dlist2)

  171.   (entlast)
  172. )


  173. ;多点打断标注
  174. (defun c:bb1 (/ dname pt9 ptlist loop ll pt10 pt ptlist_n dis)

  175.   (lhj_start)

  176.   (defun *error* (msg)
  177.     (princ "\n")
  178.     (princ "\n:::lhj_tools:::")
  179.     (princ msg)
  180.     (princ ",程序退出!")
  181.     (redraw dname 4)
  182.     (lhj_end)
  183.   )

  184.   (setq        dname         (lhj_entsel
  185.                    "\n:::lhj_tools:::请选择要打断的标注:"
  186.                    '(0 "DIMENSION")
  187.                  )
  188.         loop         T
  189.         ptlist         '()
  190.         ptlist_n '()
  191.   )
  192.   (if dname
  193.     (progn
  194.       (redraw dname 3)
  195.       (setvar "osmode" 187)
  196.       (while loop
  197.         (if (setq pt (getpoint "\n:::lhj_tools:::请点取打断点:"))
  198.           (setq ptlist (cons pt ptlist))
  199.           (setq loop nil)
  200.         )
  201.       ) ;end of while
  202.       (redraw dname 4)
  203.       (if ptlist
  204.         (progn
  205.           (setq        pt9  (dim_pt9 dname)
  206.                 pt10 (lhj_dxf dname 10)
  207.                 ll   (length ptlist)
  208.                 dis  (distance pt9 pt10)
  209.           )
  210.           (while (> ll 0)
  211.             (setq ll (1- ll)
  212.                   pt (nth ll ptlist)
  213.                   pt (p_to_l pt pt9 pt10 nil)
  214.             )
  215.             (if        (<= (fix (+ (distance pt pt9) (distance pt pt10))) dis)
  216.               (setq ptlist_n (cons pt ptlist_n))
  217.             )
  218.           )
  219.           (setq ptlist_n (reverse (p_p0_disup pt9 ptlist_n)))
  220.         ) ;end of progn
  221.         (princ "\n:::lhj_tools:::没有选择打断点!")
  222.       ) ;end of if
  223.       (setq ll (length ptlist_n))
  224.       (while (and (> ll 0) dname)
  225.         (setq ll    (1- ll)
  226.               pt    (nth ll ptlist_n)
  227.               dname (dim_break pt dname)
  228.         )
  229.       )
  230.       (princ "\n:::lhj_tools:::打断成功!")
  231.     ) ;end of progn
  232.     (princ "\n:::lhj_tools:::没有选择到标注!")
  233.   ) ;end of if
  234.   (lhj_end)
  235.   (princ)
  236. )



  237. ;多线打断标注
  238. (defun c:bb2 (/ dname pt9 ptlist ll pt10 pt ptlist_n ss ssl lname dis)

  239.   (lhj_start)

  240.   (defun *error* (msg)
  241.     (princ "\n")
  242.     (princ "\n:::lhj_tools:::")
  243.     (princ msg)
  244.     (princ ",程序退出!")
  245.     (redraw dname 4)
  246.     (lhj_end)
  247.   )

  248.   (setq        dname         (lhj_entsel
  249.                    "\n:::lhj_tools:::请选择要打断的标注:"
  250.                    '(0 "DIMENSION")
  251.                  )
  252.         ptlist         '()
  253.         ptlist_n '()
  254.   )
  255.   (if dname
  256.     (progn
  257.       (redraw dname 3)
  258.       (princ "\n:::lhj_tools:::请选择要打断标注的直线:")
  259.       (if (setq ss (ssget '((0 . "line"))))
  260.         (progn
  261.           (setq ssl (sslength ss))
  262.           (while (> ssl 0)
  263.             (setq lname         (ssname ss (setq ssl (1- ssl)))
  264.                   pt         (lhj_dxf lname 10)
  265.                   ptlist (cons pt ptlist)
  266.             )
  267.           ) ;end of while
  268.         )
  269.       )
  270.       (redraw dname 4)
  271.       (if ptlist
  272.         (progn
  273.           (setq        pt9  (dim_pt9 dname)
  274.                 pt10 (lhj_dxf dname 10)
  275.                 ll   (length ptlist)
  276.                 dis  (distance pt9 pt10)
  277.           )
  278.           (while (> ll 0)
  279.             (setq ll (1- ll)
  280.                   pt (nth ll ptlist)
  281.                   pt (p_to_l pt pt9 pt10 nil)
  282.             )
  283.             (if        (<= (fix (+ (distance pt pt9) (distance pt pt10))) dis)
  284.               (setq ptlist_n (cons pt ptlist_n))
  285.             )
  286.           )
  287.           (setq ptlist_n (reverse (p_p0_disup pt9 ptlist_n)))
  288.         ) ;end of progn
  289.         (princ "\n:::lhj_tools:::没有选择到直线!")
  290.       ) ;end of if
  291.       (setq ll (length ptlist_n))
  292.       (while (and (> ll 0) dname)
  293.         (setq ll    (1- ll)
  294.               pt    (nth ll ptlist_n)
  295.               dname (dim_break pt dname)
  296.         )
  297.       )
  298.       (princ "\n:::lhj_tools:::打断成功!")
  299.     ) ;end of progn
  300.     (princ "\n:::lhj_tools:::没有选择到标注!")
  301.   ) ;end of if
  302.   (lhj_end)
  303.   (princ)
  304. )  [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-2-25 23:11:22 | 显示全部楼层
改了改 ;
求一系列点中到基准点的距离最小点
(defun p_p0_dismin (p0 ptlist / p1 p2)
(setq p1(car ptlist)ptlist(cdr ptlist))
(foreach p2 ptlist(if (<(distance p2 p0)(distance p1 p0))(setq p1 p2)))
p1)


;将一系列点按到基准点的距离升序排列
(defun p_p0_disup (p0 ptlist )
(vl-sort ptlist '(lambda(x y)(<(distance p0 x)(distance p0 y))))
)
求一系列点中到基准点的距离最小点
(defun p_p0_dismin (p0 ptlist )
(car (p_p0_disup p0 ptlist))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-26 21:39:57 | 显示全部楼层
正准备编一个,找到现成的了,谢谢提供.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 08:12 , Processed in 0.170973 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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