明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1132|回复: 14

[讨论] grread下的扑捉问题(已支持象限扑捉)

[复制链接]
发表于 2024-6-30 23:47:22 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-7-1 09:57 编辑

新开一贴,对于这个问题,希望在本帖要解决了它,
什么问题呢?那就是,grread下支持扑捉象限点,这个问题
请大家移步先看技术帖子,再来进一步的研究...
顾版的
http://bbs.mjtd.com/forum.php?mo ... 91&highlight=grread
廊大师的
http://bbs.mjtd.com/forum.php?mo ... 90&highlight=grread

下面代码,是我今上午改写的,尝试一下,还不完美,
  1. ;;grread图元捕捉子函数-----(一级)------有缺憾,会闪烁
  2. ;;name为移动的图元、选择集,pt为光标点
  3. ;;有捕捉点则返回捕捉点,无返回光标点
  4. (defun slosnappt (name pt / cl osmo d h k lst nearpt p0 p00 p1 p2 p3 p4 p5 ptx pty x newe)
  5.   (redraw)
  6.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  7.     (progn
  8.       (cond
  9.         ((= (type name) 'ENAME) (entdel name)) ;图元先删除
  10.         ((= (type name) 'PICKSET) ;选择集
  11.           (sl-sel-redrawsel name 2) ;先隐藏
  12.         )
  13.       )
  14.       (setq
  15.         p1 nil p2 nil
  16.         cl (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*)))
  17.         h (p2uu 1.0) d (getvar "PICKBOX")
  18.         lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 30.0 d h)
  19.         p1 (cadr (grread 5))
  20.       )
  21.       ;下面三行,此时如果扑捉到实体,取得它中心p2
  22.       (if (setq newe (car (nentselp pt)))
  23.         (setq p2 (e-mid newe))
  24.       )
  25.       ;;这是第一步,取得扑捉点
  26.       (if (setq p0 (osnap pt "_NEA,_MID,_END,_INT,_CEN,_NOD,_QUA,_INS,_PER,_TAN,_APP,_EXT,_PAR"))
  27.         (setq osmo 1 nearpt p0)
  28.       )
  29.       ;;如果是NEA  只不过是判定osmo罢了吗?值得进行下去if,如果能模拟到和CAD一样丝滑,建议osmo仅仅一个好了,那就是osmo=1 ,画个矩形
  30.       (if (and (setq p0 (osnap pt "_NEA")) (equal nearpt p0 k))
  31.         (setq osmo 2 nearpt p0)
  32.       )
  33.       (if (and (setq p0 (osnap pt "_MID")) (equal nearpt p0 k))
  34.         (setq osmo 3 nearpt p0)
  35.       )
  36.       (if (and (setq p0 (osnap pt "_INT")) (equal nearpt p0 k))
  37.         (setq osmo 4 nearpt p0)
  38.       )
  39.       ;;下面三句吗,我尝试给于象限点p2,并设为OSMO=4,画交叉矢量线,可以是可以,但是操作不如CAD本身丝滑
  40.       (if (and p2 nearpt (not (equal nearpt p2 k)))
  41.         (setq osmo 4 nearpt p2)
  42.       )
  43.       (cond
  44.         ((= (type name) 'ENAME) (entdel name)) ;图元恢复
  45.         ((= (type name) 'PICKSET) ;选择集
  46.           (sl-sel-redrawsel name 1) ;恢复显示
  47.         )
  48.       )
  49.       (if nearpt
  50.         (progn
  51.           (setq ptx (car nearpt) pty (cadr nearpt))
  52.           (while lst
  53.             (setq x (car lst) p1 (list (- ptx x) (- pty x)) p2 (list (+ ptx x) (- pty x))
  54.               p3 (list (+ ptx x) (+ pty x)) p4 (list (- ptx x) (+ pty x))
  55.               p5 (list ptx (+ pty x))
  56.             )
  57.             (cond
  58.               ((= osmo 1) (grvecs (list cl p1 p2 p2 p3 p3 p4 p4 p1))) ;正方形
  59.               ((= osmo 2) (grvecs (list cl p1 p2 p2 p4 p3 p4 p3 p1))) ;俩三角
  60.               ((= osmo 3) (grvecs (list cl p1 p2 p2 p5 p5 p1))) ;三角
  61.               ((= osmo 4) (grvecs (list cl p1 p3 cl p2 p4)))  ;交叉
  62.             )
  63.             (setq lst (cdr lst))
  64.           )
  65.           (setq pt nearpt)
  66.         )
  67.       )  
  68.     )
  69.   )
  70.   pt
  71. )
下面为了大家能更好的解决这个问题,贴上另一种优秀代码,还没来得及尝试扑捉象限点的改写
  1. ;;重画选择集中的对象-----(一级)-----
  2. ;;Sel为选择集或图元名; mode为方式码
  3. ;;mode 1 在屏幕重画该选择集对象
  4. ;;mode 2 隐藏该选择集对象
  5. ;;mode 3 <醒目显示> 该选择集对象
  6. ;;mode 4 取消<醒目显示>该选择集对象
  7. (defun sl-sel-redrawsel (sel mode / n)
  8.   (if sel
  9.     (cond
  10.       ((= 'PICKSET (type sel))
  11.         (repeat (setq n (sslength sel))
  12.           (redraw (ssname sel (setq n (1- n))) mode)
  13.         )
  14.       )
  15.       ((= 'ENAME (type sel))
  16.         (redraw sel mode)
  17.       )
  18.     )
  19.   )
  20.   t
  21. )
  22. ;;grread图元捕捉子函数-----(一级)------
  23. ;;name为移动的图元、选择集,pt为光标点
  24. ;;有捕捉点则返回捕捉点,无返回光标点
  25. (defun slosnappt (name pt / p mode osmod osmode size k)
  26.   (defun sldectobin (n m / c f) ;;十进制转二进制
  27.     (setq f (if (< n 0) 1 0) n (abs n))
  28.     (while (> (setq c (cons (rem n 2) c) n (* n 0.5)) 0))
  29.     (while (< (length c) (1- m)) (setq c (cons 0 c)))
  30.     (cons f c)
  31.   )
  32.   ;;------------------
  33.   (defun sldrawvecs (pt vecs size cl / xdir)
  34.     (setq xdir (getvar 'ucsxdir)
  35.       vecs (mapcar '(lambda (x) (mapcar '(lambda (a) (mapcar '+ pt (mapcar '* (setq a (trans a 0 xdir) a (list (caddr a) (car a))) (list size size)))) x)) vecs)
  36.     )
  37.     (grvecs (apply 'append (mapcar 'cons (mapcar (function (lambda (x) cl)) vecs) vecs)))
  38.   )
  39.   ;;----------------
  40.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  41.     (progn
  42.       (if name (progn (sl-sel-redrawsel name 2) (setq k t))) ;隐藏
  43.       (if (setq
  44.             osmod '("_NEA," "_QUA," "_END," "_MID," "_CEN," "_NOD," "_INT," "_INS," "_PER," "_TAN," "_APP," "_EXT," "_PAR")
  45.             osmode (reverse (sldectobin (getvar 'osmode) 1))
  46.             size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  47.             p (osnap pt (apply 'strcat (mapcar '(lambda (x y) (if (zerop x) "" y)) osmode osmod)))
  48.             mode (cdr (assoc (if p
  49.                                (vl-some '(lambda (x) (if (equal p (cdr x) 1e-8) (car x)))
  50.                                  (vl-remove 'nil (mapcar '(lambda (x y / p) (if (zerop x) nil (if (setq p (osnap pt y)) (cons y p)))) osmode osmod)))
  51.                              )
  52.                         '(("_END," ((-1 1)(-1 -1))((-1 -1)(1 -1))((1 -1) (1 1))((1 1) (-1 1)))
  53.                            ("_MID," ((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707)(1.225 -0.707))((1.225 -0.707) (0 1.414)))
  54.                            ("_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))
  55.                              ((0 -1)(0.707 -0.707))((0.707 -0.707)(1 0)) ((1 0) (0.707 0.707))((0.707 0.707) (0 1)))
  56.                            ("_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))
  57.                              ((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)))
  58.                            ("_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)))
  59.                            ("_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)))
  60.                            ("_INS," ((-1 1)(-1 -0.1))((-1 -0.1)(0 -0.1))((0 -0.1)(0 -1.0))((0 -1.0)(1 -1))
  61.                              ((1 -1)(1 0.1))((1 0.1)(0 0.1))((0 0.1) (0 1.0))((0 1.0)(-1 1)))
  62.                            ("_PER," ((-1 1)(-1 -1))((-1 -1)(1 -1))((0 -1)(0 0))((0 0)(-1 0)))
  63.                            ("_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))
  64.                              ((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)))
  65.                            ("_NEA," ((-1 1)(1 -1))((1 -1)(-1 -1))((-1 -1)(1 1))((1 1)(-1 1)))
  66.                            ("_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)))
  67.                            ("_EXT," ((0.1 0)(0.13 0))((0.2 0)(0.23 0))((0.3 0)(0.33 0)))
  68.                            ("_PAR" ((0 1)(-1 -1))((1 1)(0 -1)))
  69.                          )
  70.                       )
  71.                  )
  72.           )
  73.         (sldrawvecs (setq p (if p p pt)) mode size (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*))))
  74.       )
  75.       (if k (sl-sel-redrawsel name 1)) ;恢复显示
  76.     )
  77.   )
  78.   (if p p pt)
  79. )


评分

参与人数 1明经币 +1 收起 理由
baitang36 + 1 师弟是夜猫子类型啊,这么晚了还发帖子

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-7-23 11:02:42 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-7-23 13:26 编辑

最终结果
  1. ;;grread图元捕捉函数-----(一级)------
  2. ;;name为移动的图元、选择集,pt为光标点
  3. ;;有捕捉点则返回捕捉点,无返回光标点
  4. (defun sl-osnappt (pt / p mode osmod osmode size cl)
  5.   (defun sldectobin (n m / c f) ;;十进制转二进制
  6.     (setq f (if (< n 0) 1 0) n (abs n))
  7.     (while (> (setq c (cons (rem n 2) c) n (* n 0.5)) 0))
  8.     (while (< (length c) (1- m)) (setq c (cons 0 c)))
  9.     (cons f c)
  10.   )
  11.   ;;------------------
  12.   (defun sldrawvecs (pt vecs size cl / xdir)
  13.     (setq xdir (getvar 'ucsxdir)
  14.       vecs (mapcar '(lambda (x) (mapcar '(lambda (a) (mapcar '+ pt (mapcar '* (setq a (trans a 0 xdir) a (list (caddr a) (car a))) (list size size)))) x)) vecs)
  15.     )
  16.     (grvecs (apply 'append (mapcar 'cons (mapcar (function (lambda (x) cl)) vecs) vecs)))
  17.   )
  18.   ;;------------------
  19.   (if (setq
  20.         size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  21.         cl (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*)))
  22.         osmod '("_NEA," "_QUA," "_END," "_MID," "_CEN," "_NOD," "_INT," "_INS," "_PER," "_TAN," "_APP," "_EXT," "_PAR")
  23.         osmode (reverse (sldectobin (getvar 'osmode) 1))
  24.         p (osnap pt (apply 'strcat (mapcar '(lambda (x y) (if (zerop x) "" y)) osmode osmod)))
  25.         mode (cdr (assoc (if p
  26.                            (vl-some '(lambda (x) (if (equal p (cdr x) 1e-8) (car x)))
  27.                              (vl-remove 'nil (mapcar '(lambda (x y / p) (if (zerop x) nil (if (setq p (osnap pt y)) (cons y p)))) osmode osmod)))
  28.                          )
  29.                     '(("_END," ((-1 1)(-1 -1))((-1 -1)(1 -1))((1 -1) (1 1))((1 1) (-1 1)))
  30.                        ("_MID," ((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707)(1.225 -0.707))((1.225 -0.707) (0 1.414)))
  31.                        ("_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))
  32.                          ((0 -1)(0.707 -0.707))((0.707 -0.707)(1 0)) ((1 0) (0.707 0.707))((0.707 0.707) (0 1)))
  33.                        ("_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))
  34.                          ((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)))
  35.                        ("_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)))
  36.                        ("_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))) ;X
  37.                        ("_INS," ((-1 1)(-1 -0.1))((-1 -0.1)(0 -0.1))((0 -0.1)(0 -1.0))((0 -1.0)(1 -1))
  38.                          ((1 -1)(1 0.1))((1 0.1)(0 0.1))((0 0.1) (0 1.0))((0 1.0)(-1 1))) ;双方形
  39.                        ("_PER," ((-1 1)(-1 -1))((-1 -1)(1 -1))((0 -1)(0 0))((0 0)(-1 0)))
  40.                        ("_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))
  41.                          ((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)))
  42.                        ("_NEA," ((-1 1)(1 -1))((1 -1)(-1 -1))((-1 -1)(1 1))((1 1)(-1 1)))
  43.                        ("_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)))
  44.                        ("_EXT," ((0.1 0)(0.13 0))((0.2 0)(0.23 0))((0.3 0)(0.33 0)))
  45.                        ("_PAR" ((0 1)(-1 -1))((1 1)(0 -1)))
  46.                      )
  47.                   )
  48.              )
  49.       )
  50.     (sldrawvecs (setq p (if p p pt)) mode size cl)
  51.   )
  52.   (if p p pt)
  53. )
  54. ;;grread图元捕捉子函数-----(一级)------
  55. ;;name为移动的图元、选择集,pt为光标点
  56. ;;有捕捉点则返回捕捉点,无返回光标点
  57. (defun slosnappt (name pt / p0 p1 p2 newe ss size k cl d)
  58.   (setq d (getvar "OSMODE"))
  59.   (if (and (< d 16384) (> d 0));;打开捕捉
  60.     (progn
  61.       (if name (progn (setq k t)(sl-sel-redrawsel name 2))) ;隐藏
  62.       (setq size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX")))
  63.       (if (setq ss (ssget "C" (polar pt 5pi4 size) (polar pt pi4 size)))
  64.         (progn
  65.           (setq newe (ssname ss 0)
  66.             p0 (e9pt newe 5)
  67.             ss (ssget "C" (polar p0 5pi4 size) (polar p0 pi4 size))
  68.           )
  69.           (if (and (or (null ss) (and ss (< (sslength ss) 2))) (> (distance p0 pt) (* 10.0 size)))
  70.             (progn
  71.               (if ss
  72.                 (setq cl (abs (- 250 (sl-getcolor (ssname ss 0)))))
  73.                 (setq cl (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*))))
  74.               )
  75.               (setq p1 (polar p0 pi size) p2 (polar p0 0 size))
  76.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d") (cons 62 cl)))
  77.               (setq p1 (polar p0 pi2 size) p2 (polar p0 3pi2 size))
  78.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d") (cons 62 cl)))
  79.             )
  80.           )
  81.         )
  82.       )
  83.       (setq pt (sl-osnappt pt))
  84.       (if k (sl-sel-redrawsel name 1)) ;恢复显示
  85.     )
  86.   )
  87.   pt
  88. )
    函数看字眼就知道是个啥,自理去即可,我发的是“理念”,就是问题是个啥子,不是代码本身,代码本身没什么意思,会写的很多。这个问题,也是有人问我要这个支持,才发现的,就是扑捉时候,要能扑捉到中心支持,要扑捉这个实体的中心定位,扩展这一功能。
     如果前面支持,那好,恭喜了,用即可。我得帖子,记住了,不是给外行看的。



 楼主| 发表于 2024-7-1 09:56:47 | 显示全部楼层
为支持象限扑捉的改写,可以用了
  1. ;;grread图元捕捉子函数-----(一级)------
  2. ;;name为移动的图元、选择集,pt为光标点
  3. ;;有捕捉点则返回捕捉点,无返回光标点
  4. (defun sl-osnappt (pt / p mode osmod osmode size cl)
  5.   (defun sldectobin (n m / c f) ;;十进制转二进制
  6.     (setq f (if (< n 0) 1 0) n (abs n))
  7.     (while (> (setq c (cons (rem n 2) c) n (* n 0.5)) 0))
  8.     (while (< (length c) (1- m)) (setq c (cons 0 c)))
  9.     (cons f c)
  10.   )
  11.   ;;------------------
  12.   (defun sldrawvecs (pt vecs size cl / xdir)
  13.     (setq xdir (getvar 'ucsxdir)
  14.       vecs (mapcar '(lambda (x) (mapcar '(lambda (a) (mapcar '+ pt (mapcar '* (setq a (trans a 0 xdir) a (list (caddr a) (car a))) (list size size)))) x)) vecs)
  15.     )
  16.     (grvecs (apply 'append (mapcar 'cons (mapcar (function (lambda (x) cl)) vecs) vecs)))
  17.   )
  18.   ;;------------------
  19.   (if (setq
  20.         size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  21.         cl (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*)))
  22.         osmod '("_NEA," "_QUA," "_END," "_MID," "_CEN," "_NOD," "_INT," "_INS," "_PER," "_TAN," "_APP," "_EXT," "_PAR")
  23.         osmode (reverse (sldectobin (getvar 'osmode) 1))
  24.         p (osnap pt (apply 'strcat (mapcar '(lambda (x y) (if (zerop x) "" y)) osmode osmod)))
  25.         mode (cdr (assoc (if p
  26.                            (vl-some '(lambda (x) (if (equal p (cdr x) 1e-8) (car x)))
  27.                              (vl-remove 'nil (mapcar '(lambda (x y / p) (if (zerop x) nil (if (setq p (osnap pt y)) (cons y p)))) osmode osmod)))
  28.                          )
  29.                     '(("_END," ((-1 1)(-1 -1))((-1 -1)(1 -1))((1 -1) (1 1))((1 1) (-1 1)))
  30.                        ("_MID," ((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707)(1.225 -0.707))((1.225 -0.707) (0 1.414)))
  31.                        ("_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))
  32.                          ((0 -1)(0.707 -0.707))((0.707 -0.707)(1 0)) ((1 0) (0.707 0.707))((0.707 0.707) (0 1)))
  33.                        ("_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))
  34.                          ((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)))
  35.                        ("_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)))
  36.                        ("_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))) ;X
  37.                        ("_INS," ((-1 1)(-1 -0.1))((-1 -0.1)(0 -0.1))((0 -0.1)(0 -1.0))((0 -1.0)(1 -1))
  38.                          ((1 -1)(1 0.1))((1 0.1)(0 0.1))((0 0.1) (0 1.0))((0 1.0)(-1 1))) ;双方形
  39.                        ("_PER," ((-1 1)(-1 -1))((-1 -1)(1 -1))((0 -1)(0 0))((0 0)(-1 0)))
  40.                        ("_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))
  41.                          ((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)))
  42.                        ("_NEA," ((-1 1)(1 -1))((1 -1)(-1 -1))((-1 -1)(1 1))((1 1)(-1 1)))
  43.                        ("_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)))
  44.                        ("_EXT," ((0.1 0)(0.13 0))((0.2 0)(0.23 0))((0.3 0)(0.33 0)))
  45.                        ("_PAR" ((0 1)(-1 -1))((1 1)(0 -1)))
  46.                      )
  47.                   )
  48.              )
  49.       )
  50.     (sldrawvecs (setq p (if p p pt)) mode size cl)
  51.   )
  52.   ;(if (and p0 p (not (equal p pt size)))
  53.   ;  (progn
  54.   ;    (setq p p0)
  55.   ;    (sldrawvecs p0 '(((-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))) size cl)
  56.   ;  )
  57.   ;)
  58.   (if p p pt)
  59. )
  60. ;;grread图元捕捉函数-----(一级)------
  61. ;;name为移动的图元、选择集,pt为光标点
  62. ;;有捕捉点则返回捕捉点,无返回光标点
  63. ;;支持象限点 三领设计 V3.0 Modify by 尘缘一生  QQ:15290049 2024.7.1  (精简后代码)
  64. (defun slosnappt (name pt / p0 p1 p2 newe size k)
  65.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  66.     (progn
  67.       (if name (progn (sl-sel-redrawsel name 2) (setq k t))) ;隐藏
  68.       (if (setq newe (car (nentselp pt)))
  69.         (progn
  70.           (setq p0 (e9pt newe 5))
  71.           (if (= (nentselp p0) nil)
  72.             (progn
  73.               (setq size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX")))
  74.               (setq p1 (polar p0 pi size) p2 (polar p0 0 size))
  75.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d"))) ;产生的象限临时线,需在函数体外删除,目前没解决函数体内删除问题
  76.               (setq p1 (polar p0 pi2 size) p2 (polar p0 3pi2 size))
  77.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d"))) ;产生的象限临时线,需在函数体外删除,目前没解决函数体内删除问题
  78.             )
  79.           )
  80.         )
  81.       )
  82.       (setq pt (sl-osnappt pt))
  83.       (if k (sl-sel-redrawsel name 1)) ;恢复显示
  84.     )
  85.   )
  86.   pt
  87. )


 楼主| 发表于 2024-7-4 01:16:29 | 显示全部楼层
  1. ;;;返回捕捉模式字串
  2. ;"_END,_MID,_CEN,_NOD,_QUA,_INT,_INS,_PER,_TAN,_NEA,_QUI,_APP,_EXT,_PAR"
  3. (defun get_osmode (/ cur_mode mode) ;(get_osmode)
  4.   (setq mode "")
  5.   (if (< 0 (setq cur_mode (getvar "osmode")) 16384)
  6.     (mapcar
  7.       (function
  8.         (lambda (x)
  9.           (if (not (zerop (logand cur_mode (car x))))
  10.             (if (zerop (strlen mode))
  11.               (setq mode (cadr x))
  12.               (setq mode (strcat mode "," (cadr x)))
  13.             )
  14.           )
  15.         )
  16.       )
  17.       '((1 "_END")
  18.          (2 "_MID")
  19.          (4 "_CEN")
  20.          (8 "_NOD")
  21.          (16 "_QUA")
  22.          (32 "_INT")
  23.          (64 "_INS")
  24.          (128 "_PER")
  25.          (256 "_TAN")
  26.          (512 "_NEA")
  27.          (1024 "_QUI")
  28.          (2048 "_APP")
  29.          (4096 "_EXT")
  30.          (8192 "_PAR")
  31.        )
  32.     )
  33.   )
  34.   mode
  35. )
  36. ;;grread图元捕捉子函数-----(一级)------有缺憾,会闪烁
  37. ;;name为移动的图元、选择集,pt为光标点
  38. ;;有捕捉点则返回捕捉点,无返回光标点
  39. (defun slosnappt (name pt / cl osmo d h k kk lst nearpt p0 p00 p1 p2 p3 p4 p5 ptx pty x newe)
  40.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  41.     (progn
  42.       (if name (progn (sl-sel-redrawsel name 2) (setq kk t))) ;隐藏
  43.       (setq
  44.         p1 nil p2 nil
  45.         cl (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*)))
  46.         h (p2uu 1.0) d (getvar "PICKBOX")
  47.         lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h)) k (* 30.0 d h)
  48.         p1 (cadr (grread 5))
  49.       )
  50.       (if (setq newe (car (nentselp pt)))
  51.         (setq p2 (e9pt newe 5))
  52.       )
  53.       (if (setq p0 (osnap pt (get_osmode)))
  54.         (setq osmo 1 nearpt p0)
  55.       )
  56.       (if (and (setq p0 (osnap pt "_NEA")) (equal nearpt p0 k))
  57.         (setq osmo 2 nearpt p0)
  58.       )
  59.       (if (and (setq p0 (osnap pt "_MID")) (equal nearpt p0 k))
  60.         (setq osmo 3 nearpt p0)
  61.       )
  62.       (if (and (setq p0 (osnap pt "_INT")) (equal nearpt p0 k))
  63.         (setq osmo 4 nearpt p0)
  64.       )
  65.       (if (and p2 nearpt (not (equal nearpt p2 k)))
  66.         (setq osmo 4 nearpt p2)
  67.       )
  68.       (if kk (sl-sel-redrawsel name 1)) ;恢复显示
  69.     )
  70.     (if nearpt
  71.       (progn
  72.         (setq ptx (car nearpt) pty (cadr nearpt))
  73.         (while lst
  74.           (setq x (car lst) p1 (list (- ptx x) (- pty x)) p2 (list (+ ptx x) (- pty x))
  75.             p3 (list (+ ptx x) (+ pty x)) p4 (list (- ptx x) (+ pty x))
  76.             p5 (list ptx (+ pty x))
  77.           )
  78.           (cond
  79.             ((= osmo 1) (grvecs (list cl p1 p2 p2 p3 p3 p4 p4 p1))) ;正方形
  80.             ((= osmo 2) (grvecs (list cl p1 p2 p2 p4 p3 p4 p3 p1))) ;俩三角
  81.             ((= osmo 3) (grvecs (list cl p1 p2 p2 p5 p5 p1))) ;三角
  82.             ((= osmo 4) (grvecs (list cl p1 p3 cl p2 p4)));交叉
  83.           )
  84.           (setq lst (cdr lst))
  85.         )
  86.         (setq pt nearpt)
  87.       )
  88.     )
  89.   )
  90.   pt
  91. )


发表于 2024-7-1 07:41:12 | 显示全部楼层
楼主是老当益壮啊,我们都老了,都要注意身体
发表于 2024-7-1 08:35:51 | 显示全部楼层
睡得太晚了
发表于 2024-7-1 10:02:07 | 显示全部楼层
新手前来学习下,grread我现在就只用过一次
 楼主| 发表于 2024-7-3 00:24:08 | 显示全部楼层
外壳部分再作一下

  1. ;;grread图元捕捉子函数-----(一级)------
  2. ;;name为移动的图元、选择集,pt为光标点
  3. ;;有捕捉点则返回捕捉点,无返回光标点
  4. ;;三领设计 尘缘一生 QQ:15290049
  5. (defun slosnappt (name pt / p0 p1 p2 newe ss size k)
  6.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  7.     (progn
  8.       (if name (progn (sl-sel-redrawsel name 2) (setq k t))) ;隐藏
  9.       (if (setq newe (car (nentselp pt)))
  10.         (progn
  11.           (setq size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  12.             p0 (e9pt newe 5)
  13.             ss (ssget "C" (polar p0 5pi4 size) (polar p0 pi4 size))
  14.           )
  15.           (if (or (null ss) (and ss (< (sslength ss) 2)))
  16.             (progn
  17.               (setq p1 (polar p0 pi size) p2 (polar p0 0 size))
  18.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d")))
  19.               (setq p1 (polar p0 pi2 size) p2 (polar p0 3pi2 size))
  20.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d")))
  21.             )
  22.           )
  23.         )
  24.       )
  25.       (vl-catch-all-apply '(lambda () (setq pt (sl-osnappt pt))))
  26.       (if k (sl-sel-redrawsel name 1)) ;恢复显示
  27.     )
  28.   )
  29.   pt
  30. )


发表于 2024-7-22 15:31:25 | 显示全部楼层
老师,请问最终完全体版本是哪个呢?想学习一下

点评

最终的已发,  发表于 2024-7-23 11:03
发表于 2024-7-23 10:41:42 | 显示全部楼层
本帖最后由 gzcsun 于 2024-7-23 10:47 编辑

本来不想说

实在忍不住
Gu_xl
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91191&highlight=grread

langjs
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=176190&highlight=grread
楼主


llsheng_73
楼主
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=176190&highlight=grread
2楼
建议 (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT")根据当前的捕捉设置来
我把G版那个按我的习惯修改了一下,没有对正交等模式进行处理
(defun dectobin(n m / c f);;十进制转二进制
  (setq f(if(< n 0)1 0)n(abs n))
  (while(>(setq c(cons(rem n 2)c)n(/ n 2))0))
  (while(<(length c)(1- m))(setq c(cons 0 c)))
  (cons f c))
(DEFUN DrawVecs(Pt Vecs Size Color / xdir);;;G版函数绘制矢量
  (setq xdir(getvar'ucsxdir)
  Vecs(mapcar'(lambda(x)(mapcar'(lambda(a)(mapcar'+ pt(mapcar'*(setq a(trans a 0 xdir)a(list(caddr a)(car a)))(List size size))))x))Vecs))
  (GRVECS(APPLY 'APPEND(MAPCAR 'CONS(MAPCAR(FUNCTION (LAMBDA (x)Color))Vecs)Vecs))))
(defun myosnap(pt / p mode osmod osmode Draftobj Size);;;修改G版函数带捕捉grread
  (if(setq Draftobj(VLA-GET-DRAFTING(VLA-GET-PREFERENCES(VLAX-GET-ACAD-OBJECT)))
     osmod'("_END," "_MID," "_CEN," "_NOD," "_QUA," "_INT," "_INS," "_PER," "_TAN," "_NEA," "_NON," "_APP," "_EXT," "_PAR")
     osmode(reverse(DECTOBIN (getvar'osmode) 1))
     size(*(/(getvar "viewsize")(cadr(getvar "screensize")))(VLA-GET-AUTOSNAPMARKERSIZE Draftobj))
     p(osnap pt(apply'strcat(mapcar'(lambda(x y)(if(zerop x)""y))osmode osmod)))
     mode(CDR(ASSOC
      (if p(vl-some'(lambda(x)(if(equal p(cdr x)1e-8)(car x)))
             (vl-remove'nil(mapcar'(lambda(x y / p)(if(zerop x)nil(if(setq p(osnap pt y))(cons y p))))osmode osmod)))"_NON,")
      '(("_END,"((-1 1)(-1 -1))((-1 -1)(1 -1))((1 -1) (1 1))((1 1) (-1 1)))
        ("_MID,"((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707)(1.225 -0.707))((1.225 -0.707) (0 1.414)))
        ("_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)))
        ("_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)))
        ("_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)))
        ("_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)))
        ("_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)))
        ("_PER,"((-1 1)(-1 -1))((-1 -1)(1 -1))((0 -1)(0 0))((0 0)(-1 0)))
        ("_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)))
        ("_NEA,"((-1 1)(1 -1))((1 -1)(-1 -1))((-1 -1)(1 1))((1 1)(-1 1)))
        ("_NON,")
        ("_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)))
        ("_EXT,"((0.1 0)(0.13 0))((0.2 0)(0.23 0))((0.3 0)(0.33 0)))
        ("_PAR"((0 1)(-1 -1))((1 1)(0 -1)))))))
    (DrawVecs(setq p(if p p pt))mode size(VLA-GET-AUTOSNAPMARKERCOLOR Draftobj)))
  (if p p pt))
(defun c:tt(/ e p) ;;选择一个圆进行移动
  (while(setq e(ssget":E:S"'((0 . "circle"))))
    (setq e(entget(ssname e 0)))
    (while(/=(car(setq p(grread t 15 0)))3)(redraw)
      (if(=(car p)5)(entmod(append e(list(cons 10(myosnap(cadr p)))))))
      ))
)

llsheng_73 象限捕捉早就可以支持,
你还抄作业乱改,
乱改算了,还发出来,
发出来算了,不支持象限捕捉还自己说是优秀代码,还要缺函数。



 楼主| 发表于 2024-7-23 10:49:10 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-7-23 13:21 编辑
gzcsun 发表于 2024-7-23 10:41
本来不想说

实在忍不住忍不住,最好学习,看明白了,这是解决什么问题的事。

函数代码写的支持,没用,不支持,无效。使用起来就不是了。
'("_END," "_MID," "_CEN," "_NOD," "_QUA," "_INT," "_INS," "_PER," "_TAN," "_NEA," "_NON," "_APP," "_EXT," "_PAR")
被前面截取先登! "_QUA,"如果放在第一个,有可能可以,这是我得怀疑,也没测试,
实际这个问题,也就是,不能做到和CAD完全一样,没有做到,代码看着行,实际办不到。
我再次说明,我帖子,别回复,只管看好了,有人看得明白咋回事!!!!


正中心的那个小正交线,定位在这里的要求。



本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-25 14:25 , Processed in 0.223808 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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