找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4907|回复: 8

[原创]:在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,判断及加入绘制捕捉记号的部分是我添加上的
[php]
;;  Grread+osnap+GRVECS
;;  Rewritten by Fools @ TheSwamp.org
;;  
;;  Use (grread) to get original point
;;  Use (osnap) to calculate accurate point
;;  Use (GRVECS) to show AutoSnapMarker
;;  No return , just show the method

(DEFUN c:tmp (/                      AUTOSNAPMARKERCOLOR              AUTOSNAPMARKERSIZE
              DRAG              GHOSTPT              LST_OSMODE      STR_OSMODE      TIME
              DistPerPixel    Bold              Draftobj              get_osmode      YPY_StrParse
              YPY_GetGrvecs   YPY_DrawVecs
             )
  ;;  CAB  10/5/2006
  ;;  Fools change a little about ","  (3/3/2007)
  ;;
  ;;  Function to return the current osmode setting in the form of a string
  ;;  If (getvar "osmode") = 175
  ;;  (get_osmode)  returns   "_end,_mid,_cen,_nod,_int,_per"  
  (DEFUN get_osmode (/ cur_mode mode$)
    (SETQ mode$ "")
    (IF        (< 0 (SETQ cur_mode (GETVAR "osmode")) 16383)
      (MAPCAR (FUNCTION        (LAMBDA        (x)
                          (IF (NOT (ZEROP (LOGAND cur_mode (CAR x))))
                            (IF        (ZEROP (STRLEN mode$))
                              (SETQ mode$ (CADR x))
                              (SETQ mode$ (STRCAT mode$ "," (CADR x)))
                            )
                          )
                        )
              )
              '((1 "_end")
                (2 "_mid")
                (4 "_cen")
                (8 "_nod")
                (16 "_qua")
                (32 "_int")
                (64 "_ins")
                (128 "_per")
                (256 "_tan")
                (512 "_nea")
                (1024 "_qui")
                (2048 "_app")
                (4096 "_ext")
                (8192 "_par")
               )
      )
    )
    mode$
  )
  ;;My functions
  (DEFUN YPY_StrParse (str delim / ptr lst)
    (WHILE (SETQ ptr (VL-STRING-SEARCH delim str))
      (SETQ lst (CONS (SUBSTR str 1 ptr) lst))
      (SETQ str (SUBSTR str (+ ptr 2)))
   )
  (REVERSE (CONS str lst))
)
  (DEFUN YPY_GetGrvecs (pt dragpt lst / KEY)
    (SETQ key T)
    (WHILE (AND key lst)
      (IF (EQUAL (OSNAP dragpt (CAR lst)) pt 1E-6)
        (SETQ key nil)
        (SETQ lst (CDR lst))
      )
    )
    (CDR (ASSOC        (CAR lst)
                '(("_end"
                   ((-1 1) (-1 -1))
                   ((-1 -1) (1 -1))
                   ((1 -1) (1 1))
                   ((1 1) (-1 1))
                  )                        ;square
                  ("_mid"
                   ((0 1.414) (-1.225 -0.707))
                   ((-1.225 -0.707) (1.225 -0.707))
                   ((1.225 -0.707) (0 1.414))
                  )                        ;triangle
                  ("_cen"
                   ((0 1) (-0.707 0.707))
                   ((-0.707 0.707) (-1 0))
                   ((-1 0) (-0.707 -0.707))
                   ((-0.707 -0.707) (0 -1))
                   ((0 -1) (0.707 -0.707))
                   ((0.707 -0.707) (1 0))
                   ((1 0) (0.707 0.707))
                   ((0.707 0.707) (0 1))
                  )                        ;circle
                  ("_nod"
                   ((0 1) (-0.707 0.707))
                   ((-0.707 0.707) (-1 0))
                   ((-1 0) (-0.707 -0.707))
                   ((-0.707 -0.707) (0 -1))
                   ((0 -1) (0.707 -0.707))
                   ((0.707 -0.707) (1 0))
                   ((1 0) (0.707 0.707))
                   ((0.707 0.707) (0 1))
                   ((-1 1) (1 -1))
                   ((-1 -1) (1 1))
                  )                        ;circle+cross
                  ("_qua"
                   ((0 1.414) (-1.414 0))
                   ((-1.414 0) (0 -1.414))
                   ((0 -1.414) (1.414 0))
                   ((1.414 0) (0 1.414))
                  )                        ;square rotate 45
                  ("_int"
                   ((-1 1) (1 -1))
                   ((-1 -1) (1 1))
                   ((1 0.859) (-0.859 -1))
                   ((-1 0.859) (0.859 -1))
                   ((0.859 1) (-1 -0.859))
                   ((-0.859 1) (1 -0.859))
                  )                        ;cross
                  ("_ins"
                   ((-1 1) (-1 -0.1))
                   ((-1 -0.1) (0 -0.1))
                   ((0 -0.1) (0 -1.0))
                   ((0 -1.0) (1 -1))
                   ((1 -1) (1 0.1))
                   ((1 0.1) (0 0.1))
                   ((0 0.1) (0 1.0))
                   ((0 1.0) (-1 1))
                  )                        ;two squares
                  ("_per"
                   ((-1 1) (-1 -1))
                   ((-1 -1) (1 -1))
                   ((0 -1) (0 0))
                   ((0 0) (-1 0))
                  )                        ;half square
                  ("_tan"
                   ((0 1) (-0.707 0.707))
                   ((-0.707 0.707) (-1 0))
                   ((-1 0) (-0.707 -0.707))
                   ((-0.707 -0.707) (0 -1))
                   ((0 -1) (0.707 -0.707))
                   ((0.707 -0.707) (1 0))
                   ((1 0) (0.707 0.707))
                   ((0.707 0.707) (0 1))
                   ((1 1) (-1 1))
                  )                        ;circle+line
                  ("_nea"
                   ((-1 1) (1 -1))
                   ((1 -1) (-1 -1))
                   ((-1 -1) (1 1))
                   ((1 1) (-1 1))
                  )                        ;two triangle
                  ("_qui")                ; ???
                  ("_app"
                   ((-1 1) (-1 -1))
                   ((-1 -1) (1 -1))
                   ((1 -1) (1 1))
                   ((1 1) (-1 1))
                   ((-1 1) (1 -1))
                   ((-1 -1) (1 1))
                  )                        ;square+cross
                  ("_ext"
                   ((0.1 0) (0.13 0))
                   ((0.2 0) (0.23 0))
                   ((0.3 0) (0.33 0))
                  )                        ;three points
                  ("_par" ((0 1) (-1 -1)) ((1 1) (0 -1))) ;two lines
                 )
         )
    )
  )
  ;;Use GRVECS
  (DEFUN YPY_DrawVecs (Pt Vecs Size Color / lst matrix)
    ;;no Z axis
    (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 0.0 1.0)
                 )
    )
    (SETQ lst (MAPCAR 'CONS
                      (MAPCAR (FUNCTION (LAMBDA (x) Color)) Vecs)
                      Vecs
              )
    )
    (GRVECS (APPLY 'APPEND lst) matrix)
  )
  ;;****************************
  ;;  Main Routine starts here  
  ;;****************************
  (VL-LOAD-COM)
  (SETQ time T)
  (SETQ str_osmode (get_osmode))
  (SETQ lst_osmode (YPY_StrParse str_osmode ","))
  (SETQ        Draftobj (VLA-GET-DRAFTING
                   (VLA-GET-PREFERENCES (VLAX-GET-ACAD-OBJECT))
                 )
  )
  (SETQ AutoSnapMarkerSize (VLA-GET-AUTOSNAPMARKERSIZE Draftobj))
  (SETQ AutoSnapMarkerColor (VLA-GET-AUTOSNAPMARKERCOLOR Draftobj))
  (WHILE time
    (grread (SETQ drag (GRREAD T 1 1))) ;;Can change like (grread T 15 2)
    (COND ((= (CAR drag) 5)
           (REDRAW)
           (SETQ drag (CADR drag))
           (IF (or (zerop (strlen str_osmode)) (NULL (SETQ ghostpt (OSNAP drag str_osmode))))
             (SETQ ghostpt drag)
             ;;Beacuse of mouse middle button scroll , calculate "DistPerPixel" every time
             (PROGN (SETQ DistPerPixel (/ (GETVAR "VIEWSIZE") (CADR (GETVAR "SCREENSIZE"))))
                    ;;Bold
                    (SETQ Bold (MAPCAR '*
                                       (LIST DistPerPixel DistPerPixel DistPerPixel)
                                       (LIST (+ AutoSnapMarkerSize 0.5)
                                             AutoSnapMarkerSize
                                             (- AutoSnapMarkerSize 0.5)
                                       )
                               )
                    )
                    (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)
          )
    )
  )
  (PRINC) ;can return ghostpt if want
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【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豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 38个

财富等级: 招财进宝

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-18 21:19 , Processed in 0.442731 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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