明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 尘缘一生

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

[复制链接]
 楼主| 发表于 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-23 13:43:37 | 显示全部楼层
bai2000 发表于 2024-7-1 07:41
楼主是老当益壮啊,我们都老了,都要注意身体

我是晚上工作,白天睡觉。
 楼主| 发表于 2024-7-23 13:44:43 | 显示全部楼层

不是太晚的问题,是我晚上工作。
发表于 2024-7-24 10:56:04 | 显示全部楼层
尘缘一生 发表于 2024-7-23 11:02
最终结果
     函数看字眼就知道是个啥,自理去即可,我发的是“理念”,就是问题是个啥子,不是代码本身 ...

老师你好,我试了  缺少函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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