找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3042|回复: 9

[每日一码] 在grread状态下实现捕捉功能并显示标记符号

[复制链接]

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-3 14:00:15 | 显示全部楼层 |阅读模式

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

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

×
TheSwamp.org上的联接:
http://www.theswamp.org/index.php?topic=12797.0

调用grread获取原始点,然后通过osnap函数捕捉准确点,并调用grvecs画出自动捕捉记号
我为了能发表在TheSwamp.org,所以很多说明是用英文写的,请大家见谅.
CAB的原代码只写了grread+osnap,判断及加入绘制捕捉记号的部分是我添加上的
  1. (DEFUN c:tmp (/ AUTOSNAPMARKERCOLOR AUTOSNAPMARKERSIZE DRAG GHOSTPT LST_OSMODE STR_OSMODE TIME DistPerPixel Bold Draftobj
  2.                 get_osmode YPY_StrParse YPY_GetGrvecs YPY_DrawVecs
  3.              )                               ;  CAB  10/5/2006
  4.                                        ;  Fools change a little about ","  (3/3/2007)
  5.                                        ;
  6.                                        ;  Function to return the current osmode setting in the form of a string
  7.                                        ;  If (getvar "osmode") = 175
  8.                                        ;  (get_osmode)  returns   "_end,_mid,_cen,_nod,_int,_per"
  9.   (DEFUN get_osmode (/ cur_mode mode$)
  10.     (SETQ mode$ "")
  11.     (IF (< 0 (SETQ cur_mode (GETVAR "osmode"))
  12.            16383
  13.         )
  14.       (MAPCAR
  15.         (FUNCTION (LAMBDA (x)
  16.                     (IF (NOT (ZEROP (LOGAND cur_mode (CAR x))))
  17.                       (IF (ZEROP (STRLEN mode$))
  18.                         (SETQ mode$ (CADR x))
  19.                         (SETQ mode$ (STRCAT mode$ "," (CADR x)))
  20.                       )
  21.                     )
  22.                   )
  23.         )
  24.         '((1 "_end") (2 "_mid")
  25.          (4 "_cen")
  26.          (8 "_nod")
  27.          (16 "_qua")
  28.          (32 "_int")
  29.          (64 "_ins")
  30.          (128 "_per")
  31.          (256 "_tan")
  32.          (512 "_nea")
  33.          (1024 "_qui")
  34.          (2048 "_app")
  35.          (4096 "_ext")
  36.          (8192 "_par")
  37.         )
  38.       )
  39.     )
  40.     mode$
  41.   )                                       ; My functions
  42.   (DEFUN YPY_StrParse (str delim / ptr lst)
  43.     (WHILE (SETQ ptr (VL-STRING-SEARCH delim str))
  44.       (SETQ lst (CONS (SUBSTR str 1 ptr) lst))
  45.       (SETQ str (SUBSTR str (+ ptr 2)))
  46.     )
  47.     (REVERSE (CONS str lst))
  48.   )
  49.   (DEFUN YPY_GetGrvecs (pt dragpt lst / KEY)
  50.     (SETQ key T)
  51.     (WHILE (AND
  52.              key
  53.              lst
  54.            )
  55.       (IF (EQUAL (OSNAP dragpt (CAR lst)) pt 1E-6)
  56.         (SETQ key nil)
  57.         (SETQ lst (CDR lst))
  58.       )
  59.     )
  60.     (CDR (ASSOC (CAR lst) '(("_end" ((-1 1) (-1 -1))
  61.                   ((-1 -1) (1 -1))
  62.                   ((1 -1) (1 1))
  63.                   ((1 1) (-1 1))
  64.                  )                       ; square
  65.                  ("_mid" ((0 1.414) (-1.225 -0.707))
  66.                   ((-1.225 -0.707) (1.225 -0.707))
  67.                   ((1.225 -0.707) (0 1.414))
  68.                  )                       ; triangle
  69.                  ("_cen" ((0 1) (-0.707 0.707))
  70.                   ((-0.707 0.707) (-1 0))
  71.                   ((-1 0) (-0.707 -0.707))
  72.                   ((-0.707 -0.707) (0 -1))
  73.                   ((0 -1) (0.707 -0.707))
  74.                   ((0.707 -0.707) (1 0))
  75.                   ((1 0) (0.707 0.707))
  76.                   ((0.707 0.707) (0 1))
  77.                  )                       ; circle
  78.                  ("_nod" ((0 1) (-0.707 0.707))
  79.                   ((-0.707 0.707) (-1 0))
  80.                   ((-1 0) (-0.707 -0.707))
  81.                   ((-0.707 -0.707) (0 -1))
  82.                   ((0 -1) (0.707 -0.707))
  83.                   ((0.707 -0.707) (1 0))
  84.                   ((1 0) (0.707 0.707))
  85.                   ((0.707 0.707) (0 1))
  86.                   ((-1 1) (1 -1))
  87.                   ((-1 -1) (1 1))
  88.                  )                       ; circle+cross
  89.                  ("_qua" ((0 1.414) (-1.414 0))
  90.                   ((-1.414 0) (0 -1.414))
  91.                   ((0 -1.414) (1.414 0))
  92.                   ((1.414 0) (0 1.414))
  93.                  )                       ; square rotate 45
  94.                  ("_int" ((-1 1) (1 -1))
  95.                   ((-1 -1) (1 1))
  96.                   ((1 0.859) (-0.859 -1))
  97.                   ((-1 0.859) (0.859 -1))
  98.                   ((0.859 1) (-1 -0.859))
  99.                   ((-0.859 1) (1 -0.859))
  100.                  )                       ; cross
  101.                  ("_ins" ((-1 1) (-1 -0.1))
  102.                   ((-1 -0.1) (0 -0.1))
  103.                   ((0 -0.1) (0 -1.0))
  104.                   ((0 -1.0) (1 -1))
  105.                   ((1 -1) (1 0.1))
  106.                   ((1 0.1) (0 0.1))
  107.                   ((0 0.1) (0 1.0))
  108.                   ((0 1.0) (-1 1))
  109.                  )                       ; two squares
  110.                  ("_per" ((-1 1) (-1 -1))
  111.                   ((-1 -1) (1 -1))
  112.                   ((0 -1) (0 0))
  113.                   ((0 0) (-1 0))
  114.                  )                       ; half square
  115.                  ("_tan" ((0 1) (-0.707 0.707))
  116.                   ((-0.707 0.707) (-1 0))
  117.                   ((-1 0) (-0.707 -0.707))
  118.                   ((-0.707 -0.707) (0 -1))
  119.                   ((0 -1) (0.707 -0.707))
  120.                   ((0.707 -0.707) (1 0))
  121.                   ((1 0) (0.707 0.707))
  122.                   ((0.707 0.707) (0 1))
  123.                   ((1 1) (-1 1))
  124.                  )                       ; circle+line
  125.                  ("_nea" ((-1 1) (1 -1))
  126.                   ((1 -1) (-1 -1))
  127.                   ((-1 -1) (1 1))
  128.                   ((1 1) (-1 1))
  129.                  )                       ; two triangle
  130.                  ("_qui")               ; ???
  131.                  ("_app" ((-1 1) (-1 -1))
  132.                   ((-1 -1) (1 -1))
  133.                   ((1 -1) (1 1))
  134.                   ((1 1) (-1 1))
  135.                   ((-1 1) (1 -1))
  136.                   ((-1 -1) (1 1))
  137.                  )                       ; square+cross
  138.                  ("_ext" ((0.1 0) (0.13 0))
  139.                   ((0.2 0) (0.23 0))
  140.                   ((0.3 0) (0.33 0))
  141.                  )                       ; three points
  142.                  ("_par" ((0 1) (-1 -1))
  143.                   ((1 1) (0 -1))
  144.                  )                       ; two lines
  145.                 )
  146.          )
  147.     )
  148.   )                                       ; Use GRVECS
  149.   (DEFUN YPY_DrawVecs (Pt Vecs Size Color / lst matrix)        ; no Z axis
  150.     (SETQ matrix (LIST (LIST Size 0.0 0.0 (CAR pt)) (LIST 0.0 Size 0.0 (CADR pt)) (LIST 0.0 0.0 1.0 0.0) (LIST 0.0 0.0
  151.                                                                                                                0.0 1.0
  152.                                                                                                          )
  153.                  )
  154.     )
  155.     (SETQ lst (MAPCAR
  156.                 'CONS
  157.                 (MAPCAR
  158.                   (FUNCTION (LAMBDA (x)
  159.                               Color
  160.                             )
  161.                   )
  162.                   Vecs
  163.                 )
  164.                 Vecs
  165.               )
  166.     )
  167.     (GRVECS (APPLY
  168.               'APPEND
  169.               lst
  170.             ) matrix
  171.     )
  172.   )                                       ; ****************************
  173.                                        ;  Main Routine starts here
  174.                                        ; ****************************
  175.   (VL-LOAD-COM)
  176.   (SETQ time T)
  177.   (SETQ str_osmode (get_osmode))
  178.   (SETQ lst_osmode (YPY_StrParse str_osmode ","))
  179.   (SETQ Draftobj (VLA-GET-DRAFTING (VLA-GET-PREFERENCES (VLAX-GET-ACAD-OBJECT))))
  180.   (SETQ AutoSnapMarkerSize (VLA-GET-AUTOSNAPMARKERSIZE Draftobj))
  181.   (SETQ AutoSnapMarkerColor (VLA-GET-AUTOSNAPMARKERCOLOR Draftobj))
  182.   (WHILE time
  183.     (grread (SETQ drag (GRREAD T 1 1)))        ; Can change like (grread T 15 2)
  184.     (COND
  185.       ((= (CAR drag) 5)
  186.         (REDRAW)
  187.         (SETQ drag (CADR drag))
  188.         (IF (or
  189.               (zerop (strlen str_osmode))
  190.               (NULL (SETQ ghostpt (OSNAP drag str_osmode)))
  191.             )
  192.           (SETQ ghostpt drag)               ; Beacuse of mouse middle button scroll , calculate "DistPerPixel" every time
  193.           (PROGN
  194.             (SETQ DistPerPixel (/ (GETVAR "VIEWSIZE") (CADR (GETVAR "SCREENSIZE")))) ; Bold
  195.             (SETQ Bold (MAPCAR
  196.                          '*
  197.                          (LIST DistPerPixel DistPerPixel DistPerPixel)
  198.                          (LIST (+ AutoSnapMarkerSize 0.5) AutoSnapMarkerSize (- AutoSnapMarkerSize 0.5))
  199.                        )
  200.             )
  201.             (FOREACH item Bold
  202.               (YPY_DrawVecs ghostpt (YPY_GetGrvecs ghostpt drag lst_osmode) item AutoSnapMarkerColor)
  203.             )
  204.           )
  205.         )
  206.       )
  207.       ((= (CAR drag) 3)
  208.         (IF (NULL (SETQ ghostpt (OSNAP (CADR drag) (get_osmode))))
  209.           (SETQ ghostpt (CADR drag))
  210.         )
  211.         (REDRAW)
  212.         (SETQ time nil)
  213.       )
  214.     )
  215.   )
  216.   (PRINC)                               ; can return ghostpt if want
  217. )

本帖被以下淘专辑推荐:

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

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-3-3 16:28:54 | 显示全部楼层
楼主:测试时发现,当关闭捕捉时运行会出错。
增加一个条件选择即可解决问题。修改部分如下所示:
[PHP]
    (WHILE time
        (GRREAD (SETQ drag (GRREAD T 1 1)))
        (COND
            ((= (CAR drag) 5)
             (REDRAW)
             (SETQ drag (CADR drag))
             (IF (OR (= 0 (GETVAR "osmode"))
                     (> (GETVAR "osmode") 15359)
                 )
                 (SETQ ghostpt drag)
                 (IF (NULL (SETQ ghostpt (OSNAP drag str_osmode)))
                     (SETQ ghostpt drag)
                     (FOREACH item Bold
                         (YPY_DrawVecs
                             ghostpt
                             (YPY_GetGrvecs ghostpt drag lst_osmode)
                             item
                             AutoSnapMarkerColor
                         )
                     )
                 )
             )
            )
            ((= (CAR drag) 3)
             (IF (NULL (SETQ ghostpt (OSNAP (CADR drag) (get_osmode))))
                 (SETQ ghostpt (CADR drag))
             )
             (REDRAW)
             (SETQ time nil)
            )
        )
    )
[/PHP]
另:"AutoSnap Marker Size"和"AutoSnap marker color"可以通过(vlax-get-acad-object)函数得到模型树,并进一步分析之得到。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

 楼主| 发表于 2007-3-3 19:34:50 | 显示全部楼层
多谢zml84!
有关的"AutoSnap Marker Size"和"AutoSnap marker color"获取,首贴已经更新!
另外更新了DistPerPixel获取,主要是避免中键缩放的影响.
你提到的取消捕捉发生错误,是因为我以为(osnap pt "")将返回nil,结果不是,而是一个点,加入判断str_osmode是否为""即可,首贴已更新.
[php]
(IF (or (zerop (strlen str_osmode)) (NULL (SETQ ghostpt (OSNAP drag str_osmode))))
             (SETQ ghostpt drag)
              (PROGN         ...   )
)
[/php]
如果觉得捕捉时显示十字光标不好看可以改变grread的参数,以实现
不显示十字光标或显示为对象选择光标,甚至可以另画一个光标,:)
例如将(grread (SETQ drag (GRREAD T 1 1)))改为(GRREAD T 15 2)

程序还有许多不足之处,请大家多提宝贵意见.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-4 13:55:45 | 显示全部楼层
有创意,要是能实现极轴追踪就更牛了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2007-3-4 15:53:00 | 显示全部楼层
费这么大劲,还不如arx,我反正是arx了。
其实arx里捕捉显示的原理也是这样的.

考虑东西还有很多
比如 极轴 对象追踪 磁吸 中间打入另一个捕捉 输入距离 透明命令 等等

而且要把函数包装起来,不然每次要用,都要拷贝这么多的代码,不是很好.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

 楼主| 发表于 2007-3-4 22:18:11 | 显示全部楼层
获取AutoSnapMarker 颜色和尺寸,也可以用下面这种方法
(getenv "AutoSnapColor")  
(getenv "AutoSnapSize")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2007-3-8 22:29:27 | 显示全部楼层
自动捕捉磁吸问题

  1. ;;;点p在 自动捕捉点posmode磁吸范围内?
  2. ;;;((= (CAR drag) 5)时, NIL用p进行计算 ,T用posmode
  3. (defun In_AutoSnapBox(p posmode)
  4.   (and (= 4(logand(getvar "autosnap")4))
  5.        (> (* (atoi(getenv "AutoSnapSize")) 1.414
  6.                   (/ (GETVAR "VIEWSIZE") (CADR (GETVAR "SCREENSIZE"))))
  7.           (distance p posmode)
  8.        )
  9.   )
  10. )

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2007-3-9 00:40:17 | 显示全部楼层
极轴写好了,
大家努力:)

极轴的信息在
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R17.0\ACAD-5001:804\FixedProfile\Editor Configuration
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-4-18 00:20:00 | 显示全部楼层
在CAD2007中无法运行.
提示信息:
命令: tmp ; 用户警告: 给保护符号赋值: drag <- (5 (124.565 116.191 0.0))
; 从中断循环重置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-10 18:00:31 | 显示全部楼层
终于高出这个东西来了,等待了很久!多谢楼上各位
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 13:35 , Processed in 0.457637 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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