明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 800|回复: 8

[提问] 动态引线标注点击生成时求增加捕捉功能,谢谢~

[复制链接]
发表于 2024-10-9 11:14:27 | 显示全部楼层 |阅读模式
  1. (defun bz (/ *error* name1 name2 name3)
  2.     (defun *error* (msg)    ;将描述错误的字符串存入变量msg
  3.   (entdel name1)
  4.   (entdel name2)
  5.   (if name3
  6.       (entdel name3)
  7.   )
  8.   (princ "错误: ")
  9.   (princ msg)
  10.     )          ;打印错误信息
  11.    
  12.     (setq ty (getvar "TEXTSTYLE"))
  13.     (setq ht (atof txtht))
  14.     (if (= ht 0)
  15.   (progn
  16.   (prompt "字高为0!")
  17.   (terpri)
  18.   );progn
  19.   );if
  20.     (setq Scale (/ ht 2.5));
  21.     (setq kd1 (caadr (textbox (list '(0 . "text")
  22.             (cons 1 txt1)
  23.             (cons 40 ht)
  24.             (cons 41 1)
  25.             (cons 7 ty)
  26.             (cons 62 7)
  27.             )
  28.          )
  29.         )
  30.     )
  31.           ;字高ht,字宽高比1,可以自己设置,字体为当前字体
  32.     (setq kd2 (caadr (textbox (list '(0 . "text")
  33.             (cons 1 txt2)
  34.             (cons 40 ht)
  35.             (cons 41 1)
  36.             (cons 7 ty)
  37.             (cons 62 7)
  38.             )
  39.          )
  40.         )
  41.     )
  42.           ;字高ht,字宽高比1,可以自己设置,字体为当前字体
  43.     (setq kd (max kd1 kd2)
  44.     kd (+ kd (* 0.50 Scale))
  45.     )
  46.     (setq p (getpoint "\n输入基点:"))
  47.     (setq pd t)
  48.     (while pd
  49.   (setq gr   (grread t 4 1)
  50.         mode (car gr)
  51.         pt   (cadr gr)
  52.   )
  53.   (if (= kd3 0)
  54.       (setq kd kd1)
  55.   )
  56.   (if (and (listp pt) (>= (car pt) (car p)))
  57.       (progn
  58.     (setq p0 (polar pt 0 kd))
  59.     (setq p1 (polar pt 0 (/ (- kd kd1) 2))
  60.           p1 (polar p1 (angtof "90") (* 0.70 Scale))
  61.     )
  62.     (setq p2 (polar pt 0 (/ (- kd kd2) 2))
  63.           p2 (polar p2 (angtof "270") (* 3.20 Scale))
  64.     )
  65.       )
  66.   )
  67.   (if (and (listp pt) (< (car pt) (car p)))
  68.       (progn
  69.     (setq p0 (polar pt pi kd))
  70.     (setq p1 (polar p0 0 (/ (- kd kd1) 2))
  71.           p1 (polar p1 (angtof "90") (* 0.70 Scale))
  72.     )
  73.     (setq p2 (polar p0 0 (/ (- kd kd2) 2))
  74.           p2 (polar p2 (angtof "270") (* 3.20 Scale))
  75.     )
  76.       )
  77.   )
  78.   (if (= mode 5)
  79.       (progn
  80.     (if name1
  81.         (entdel name1)
  82.     )
  83.     (entmake (list '(0 . "LWPOLYLINE")
  84.              '(100 . "AcDbEntity")
  85.              '(100 . "AcDbPolyline")
  86.              '(90 . 3)
  87.              (cons 10 p)
  88.              (cons 10 pt)
  89.              (cons 10 p0)
  90.              (cons 62 3)
  91.        )
  92.     )
  93.     (setq name1 (entlast))
  94.     (if name2
  95.         (entdel name2)
  96.     )
  97.     (entmake (list '(0 . "text")
  98.              (cons 1 txt1)
  99.              (cons 40 ht)
  100.              (cons 41 1)
  101.              (cons 10 p1)
  102.              (cons 7 ty)(cons 62 7)
  103.        )
  104.     )
  105.           ;字高ht,字宽高比1,可以自己设置,字体为当前字体
  106.     (setq name2 (entlast))
  107.     (if name3
  108.         (entdel name3)
  109.     )
  110.     (if (= kd3 1)
  111.         (entmake (list '(0 . "text")
  112.            (cons 1 txt2)
  113.            (cons 40 ht)
  114.            (cons 41 1)
  115.            (cons 10 p2)
  116.            (cons 7 ty)(cons 62 7)
  117.            )
  118.         )
  119.     )
  120.           ;字高ht,字宽高比1,可以自己设置,字体为当前字体
  121.     (if (= kd3 1)
  122.         (setq name3 (entlast))
  123.     )
  124.       )
  125.   )
  126.   (if (= mode 3)
  127.       (setq pd nil)
  128.   )
  129.   (if (or (= mode 2) (= mode 25))
  130.       (progn (setq pd nil)
  131.        (entdel name1)
  132.        (entdel name2)
  133.        (if name3
  134.            (entdel name3)
  135.        )
  136.       )
  137.   )
  138.     )
  139.     (princ)
  140. )

  141. (defun getdata ()
  142.     (setq txt1 (get_tile "a1"))
  143.     (setq txt2 (get_tile "a2"))
  144.     (if  (= (get_tile "a3") "0")
  145.   (setq kd3 0)
  146.   (setq kd3 1)
  147.     )
  148.     (setq txtht(get_tile "a4"))
  149. )

  150. (defun c:yxbz ()
  151.           ;(步骤1)建立临时对话框
  152.     (setq tempname (vl-filename-mktemp "temp.dcl")
  153.     filen     (open tempname "w")
  154.     )
  155.     (foreach stream
  156.        '("yxbz:dialog{"
  157.          "\n  label = "
  158.          动态引线标注
  159.          ";"
  160.          "\n  :edit_box {key = "a1"; label = "线上文字:"; width = 40 ;}"
  161.          "\n  :toggle {key = "a3"; label = "增加线下文字"; value = "
  162.          0
  163.          ";}"
  164.          "\n  :edit_box {key = "a2"; label = "线下文字:"; width = 40; is_enabled = false;}"
  165.          "\n  :edit_box {key = "a4"; label = "文字高度:"; width = 20; }"
  166.          "\n  ok_cancel;}"
  167.         )
  168.   (princ stream filen)
  169.     )
  170.     (close filen)
  171.     (setq dclname tempname)
  172.           ;(步骤2)加载并显示对话框
  173.     (setq dcl_re (load_dialog dclname))
  174.     (if  (not (new_dialog "yxbz" dcl_re))
  175.   (exit)
  176.     )
  177.           ;(步骤3)定义对话框控件(运用set_tile、action_tile、mode_tile、get_tile等函数)
  178.     (if  txt1
  179.   (set_tile "a1" txt1)
  180.   (set_tile "a1" "动态标注")
  181.     )
  182.     (if  txt2
  183.   (set_tile "a2" txt2)
  184.   (set_tile "a2" "动态标注")
  185.     )
  186.     (if  kd3
  187.   (set_tile "a3" (rtos kd3))
  188.     )          ;注意set_tile函数中赋值均为字符串(带双引号),就连关键词也要加上双引号。
  189.     (if  (= kd3 0)
  190.   (mode_tile "a2" 1)
  191.     )
  192.     (if  (= kd3 1)
  193.   (mode_tile "a2" 0)
  194.     )
  195.     (if  txtht
  196.   (set_tile "a4" txtht)
  197.   (set_tile "a4" "2.5")
  198.     )
  199.     (action_tile
  200.   "a3"
  201.   "(if (= (get_tile "a3") "0") (mode_tile "a2" 1) (mode_tile "a2" 0))"
  202.     )          ;点击时才起作用
  203.     (action_tile "accept" "(getdata)(done_dialog 1)")
  204.     (action_tile "cancel" "(done_dialog)")
  205.           ;(步骤4)激活并卸载对话框,并进行对话框隐藏后的操作。
  206.     (setq std (start_dialog))
  207.     (unload_dialog dcl_re)
  208.     (vl-file-delete dclname)
  209.     (if  (= std 1)
  210.   (bz)
  211.     )
  212.     (princ)
  213. )
论坛上的代码,希望最后点击生成时增加捕捉功能,以便能定位到指定位置,多个标注的话也能对齐,求大佬指点怎么改进,谢谢~
发表于 2024-10-9 13:36:30 | 显示全部楼层
生成引线pline前先osnap一下pt,再相应更新一下p0
 楼主| 发表于 2024-10-9 14:30:40 | 显示全部楼层
kozmosovia 发表于 2024-10-9 13:36
生成引线pline前先osnap一下pt,再相应更新一下p0

求详细指导~
发表于 2024-10-9 22:19:46 | 显示全部楼层
用了grread函数,想实现捕捉功能,很难。要改变一下思路。
发表于 2024-10-10 09:02:24 | 显示全部楼层
看G版的“自定义带捕捉的grread函数”
http://bbs.mjtd.com/forum.php?mo ... 4grread%BA%AF%CA%FD
 楼主| 发表于 2024-10-10 10:30:23 | 显示全部楼层
panliang9 发表于 2024-10-10 09:02
看G版的“自定义带捕捉的grread函数”
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91191&highligh ...

这个帖子我搜到过,但没看懂,有部分内容暂时还没权限看~
发表于 2024-10-10 10:33:25 | 显示全部楼层
这么写代码。弄grread,还不如直接command mleader来得好
 楼主| 发表于 2024-10-10 14:46:15 | 显示全部楼层
kozmosovia 发表于 2024-10-10 10:33
这么写代码。弄grread,还不如直接command mleader来得好

可是需要这样的样式啊,并且mleader不能在水平横线上下都有文字吧?
发表于 2024-10-10 16:11:09 | 显示全部楼层
样式可以定义,

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-12-23 01:56 , Processed in 0.224314 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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