明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 989|回复: 21

[经验] grread之历史开发经验剖析

[复制链接]
发表于 2024-6-30 05:44:34 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-7-1 01:06 编辑

如题,那么三领哪,在这个问题上,一直再完善改进,说下子自己对这个问题的理解。
一:如图所示

当我们对选择集进行变换时候,集成热键开关,是很方便的,实际上,任何二开,这个是需要作的,并且是一定要做好的!!
比如:当我们复制选择集时,按下TAB键,就转90度,当然转了文字会不符合书写,比如块内文字。集成文字归正,一并解决。
注:经过历史测试,选择集采用函数去变换,还不如COMMAND速度高效。令外,选择集可以做成块,再作这个功能,是另一办法,代码在“五”项展示
二:代码
  1. ;;移动-拷贝-旋转-镜像-递增-放缩------(一级)---------
  2. ;三领设计 V3.0 Modify by 尘缘一生  QQ:15290049 2024.6.30  (精简后代码)
  3. ;;ss:实体、实体表、选择集 p0 移动起点 nil | k: t(move) nil(copy)
  4. (defun sldomov (ss p0 k / e_lst p1 p2 pt pt1 loop ang dis f3 f8 bb p00 a b e1 ee)
  5.   (setq e_lst (sysvar '("QAFLAGS" "CMDECHO" "NOMUTT" "OSMODE" "ORTHOMODE")))
  6.   (cond
  7.     ((= (type ss) 'ENAME) (setq ss (ssadd ss))) ;图元
  8.     ((= (type ss) 'LIST) (setq ss (sl:pickset-fromlist ss))) ;实体表
  9.   )
  10.   (command "_.undo" "be") ;;舍弃高级代码,加速
  11.   (setvar "CMDECHO" 0) ;;命令显示关闭
  12.   (setvar "NOMUTT" 1)
  13.   (setvar "QAFLAGS" 0)
  14.   (if (= p0 nil)
  15.     (setq p0 (ssmpt ss)) ;选择集之中心
  16.   )
  17.   (princ
  18.     "\n->[逆转90度(TAB)/取角(A)/LIN.(E)/<-mir->(D)/↑mir ↓(S)/放大(Q)/缩小(W)/递增(Z)/递减(J)/大一倍(+)/小一半(-)/复制当前(C)/基点(X)/正交(F8)/扑捉(F3)](空格..复制)(左键>当前)(右键>退出)"
  19.   )
  20.   (setq loop t pt1 p0 p2 p0 f8 (getvar "ORTHOMODE") f3 (getvar "OSMODE"))
  21.   (while loop
  22.     (setq bb (grread t 15 2) p00 (cadr bb))
  23.     (cond
  24.       ((equal bb '(2 6));F3切换捕捉开关
  25.         (cond
  26.           ((and (< f3 16384) (/= f3 0))
  27.             (setq f3 (+ f3 16384))
  28.             (prompt "\n <对象捕捉 关>")
  29.           )
  30.           ((or (= f3 0) (>= f3 16384))
  31.             (setq f3 16383)
  32.             (prompt "\n <对象捕捉 开>")
  33.           )
  34.         )
  35.         (setvar "OSMODE" f3) (redraw)
  36.       )   
  37.       ((equal bb '(2 15))    ;F8切换正交开关
  38.         (if (= f8 0)
  39.           (progn (setq f8 1) (prompt "\n <正交 开>"))
  40.           (progn (setq f8 0) (prompt "\n <正交 关>"))
  41.         )
  42.         (setvar "ORTHOMODE" f8) (redraw)
  43.       )
  44.       ((= (car bb) 5)
  45.         (redraw)
  46.         (if (= f8 1)
  47.           (progn
  48.             (setq ang (angle p2 p00)) ;注意:凡正交,P2点比较的,必须是WHILE循坏外的固定点,循环体内P2若有新值,程序会在过程中重新正交定位位置了就
  49.             (cond
  50.               ((or (and (> ang pi4) (< ang 3pi4)) (and (> ang 5pi4) (< ang 7pi4)))
  51.                 (setq pt (list (car p2) (cadr p00)))
  52.               )
  53.               (t
  54.                 (setq pt (list (car p00) (cadr p2)))
  55.               )
  56.             )
  57.           )
  58.           (setq pt p00)
  59.         )
  60.         (if (and (<= f3 16384) (> f3 0) (/= f8 1))
  61.           (setq pt (slosnappt ss pt)) ;slosnappt 扑捉函数,很遗憾,目前没有解决扑捉象限点问题
  62.         )
  63.         (if (> (distance p0 pt) 0.001)
  64.           (command "move" ss "" "_non" p0 "_non" pt)
  65.         )  
  66.         (setq p0 pt)
  67.       )
  68.       ((member bb '((2 9)))      ;;table 键
  69.         (command "ROTATE" ss "" "_non" pt 90)
  70.         (setq ss (sl-wzgz ss))
  71.       )
  72.       ((member bb '((2 65) (2 97)))   ;;A 旋转定角
  73.         (ss-rotang ss 0) ;选择集先转0度水平
  74.         (setq a (ss9pt ss 1))
  75.         (setq b (polar a 0 500))
  76.         (command ".rotate" ss "" "_non" a "r" "_non" a (polar pt (angle pt b) (distance pt b)) pause)
  77.         (setq ss (sl-wzgz ss));sl-wzgz  文字归正函数,凡是有旋转操作的,都需要对选择集里面的文字书写归正,以下同。
  78.       )
  79.       ((member bb '((2 115) (2 83)))  ;;S s 上下翻
  80.         (command "mirror" ss "" "_non" pt (mapcar '- pt '(1 0)) "Y")
  81.       )
  82.       ((member bb '((2 100) (2 68))) ;;D d 左右翻
  83.         (command "mirror" ss "" "_non" pt (mapcar '- pt '(0 1)) "Y")
  84.       )
  85.       ((or (member bb '((2 13))) (= (car bb) 3));;左键、回车
  86.         (if (= k t) ;;移动
  87.           (setq loop nil)
  88.           (progn
  89.             (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  90.             (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
  91.           )
  92.         )
  93.       )
  94.       ((member bb '((2 69) (2 101)))   ;;E e 齐线
  95.         (setq ss (ss-rotang ss 0)) ;选择集齐线,当首先选择集变水平0度
  96.         (setq e1 (car (setq ee (entsel "\n -->请选择要对齐的实体"))))
  97.         (setq ang (e-ang e1 (cadr ee))) ;取实体的角度集成
  98.         (setq ss (ss-rotang ss ang)) ;此时作齐线
  99.         (setq ss (sl-wzgz ss)) ;sl-wzgz  文字归正函数,凡是有旋转操作的,都需要对选择集里面的文字书写归正,以下同。
  100.       )
  101.       ((member bb '((2 67) (2 99)))   ;;C c 复制在当前
  102.         (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  103.         (setq ang (angle pt1 pt) dis (distance pt1 pt) pt1 pt)
  104.       )
  105.       ((and (member bb '((2 32))) ang dis) ;;空格键
  106.         (command "copy" ss "" "_non" '(0 0) "_non" '(0 0))
  107.         (command "MOVE" ss "" "_non" pt1 "_non" (setq pt1 (polar pt1 ang dis))) ;;移位
  108.       )
  109.       ((member bb '((2 87) (2 119)))         ;;缩小  W w
  110.         (command "scale" ss "" "_non" pt "0.9")
  111.       )
  112.       ((member bb '((2 81) (2 113)))         ;;放大  Q q
  113.         (command "scale" ss "" "_non" pt "1.1")
  114.       )
  115.       ((equal bb '(2 45))         ;;缩小一半 -
  116.         (command "scale" ss "" "_non" pt "0.5")
  117.       )
  118.       ((member bb '((2 43) (2 61))) ;;放大一倍 +
  119.         (command "scale" ss "" "_non" pt "2.0")
  120.       )
  121.       ((member bb '((2 90) (2 122)))  ;;递增 Z z
  122.         (setq ss (ss++ ss 1)) ;尾部递增,请自理即可
  123.       )
  124.       ((member bb '((2 74) (2 106)))  ;;递减 J j
  125.         (setq ss (ss++ ss -1));尾部递减,请自理即可
  126.       )
  127.       ((member bb '((2 88) (2 120)))  ;;基点 X x
  128.         (command "MOVE" ss "" "_non" pt "_non" p0)  ;;移回去
  129.         (setq p1 (getpoint "\n 基点"))
  130.         (command "MOVE" ss "" "_non" p1 "_non" p0)
  131.       )
  132.       ((or t (member (car bb) '(11 25)));;右键 其余键
  133.         (if (= k t) ;;移动
  134.           (command "MOVE" ss "" "_non" pt "_non" p0)  ;;移回去
  135.           (sl:erase ss) ;很明显,删除ss
  136.         )
  137.         (setq loop nil)
  138.       )
  139.     )
  140.   )
  141.   (redraw)
  142.   (command "_.undo" "e")
  143.   (mapcar 'eval e_lst)
  144.   (princ)
  145. )
  146. ;;!!!!!!!!!!!!!!!!!!!!!!!!
  147. ;;构造命令调用它的使用方法
  148. ;;点移---------
  149. (defun c:d-mov (/ s)
  150.   (if (setq s (ssget))
  151.     (sldomov s (cadr (grread 5)) t)
  152.   )
  153. )
  154. ;;重复点移----
  155. (defun c:dd-mov (/ s)
  156.   (while (setq s (ssget ":S"))
  157.     (sldomov s (cadr (grread 5)) t)
  158.   )
  159. )
  160. ;;点拷--------
  161. (defun c:d-cop (/ s)
  162.   (if (setq s (ssget))
  163.     (progn
  164.       (command "copy" s "" "_non" '(0 0) "_non" '(0 0))
  165.       (sldomov s (cadr (grread 5)) nil)
  166.     )
  167.   )
  168. )
  169. ;;重复点拷----
  170. (defun c:dd-cop (/ s)
  171.   (while (setq s (ssget ":S"))
  172.     (command "copy" s "" "_non" '(0 0) "_non" '(0 0))
  173.     (sldomov s (cadr (grread 5)) t)
  174.   )
  175. )
三:grread下的扑捉函数
也就是这个函数,不支持扑捉象限点 QUA 16,虽然代码包含,但无效,为什么呢?窃以为因为当鼠标移到比时:如圆附近时,扑捉的是NEA了。本坛至少3个版本这个问题,没有一个支持的。三领也尚未解决。
考虑这个问题需要附带再开发,采取包容盒取中点来作,留待时日吧......
  1. ;;grread图元捕捉子函数-----(一级)------
  2. ;;name为移动的图元、选择集,pt为光标点
  3. ;;有捕捉点则返回捕捉点,无返回光标点
  4. (defun slosnappt (name pt / p mode osmod osmode size)
  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 color / 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) color)) vecs) vecs)))
  17.   )
  18.   ;;----------------
  19.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  20.     (progn
  21.       (cond
  22.         ((= (type name) 'ENAME) (entdel name)) ;图元先删除
  23.         ((= (type name) 'PICKSET) ;选择集
  24.           (sl-sel-redrawsel name 2) ;先隐藏
  25.         )
  26.       )
  27.       (if (setq
  28.             osmod '("_END," "_MID," "_CEN," "_NOD," "_QUA," "_INT," "_INS," "_PER," "_TAN," "_NEA," "_APP," "_EXT," "_PAR")
  29.             osmode (reverse (sldectobin (getvar 'osmode) 1))
  30.             size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  31.             p (osnap pt (apply 'strcat (mapcar '(lambda (x y) (if (zerop x) "" y)) osmode osmod)))
  32.             mode (cdr (assoc (if p
  33.                                (vl-some '(lambda (x) (if (equal p (cdr x) 1e-8) (car x)))
  34.                                  (vl-remove 'nil (mapcar '(lambda (x y / p) (if (zerop x) nil (if (setq p (osnap pt y)) (cons y p)))) osmode osmod)))
  35.                              )
  36.                         '(("_END," ((-1 1)(-1 -1))((-1 -1)(1 -1))((1 -1) (1 1))((1 1) (-1 1)))
  37.                            ("_MID," ((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707)(1.225 -0.707))((1.225 -0.707) (0 1.414)))
  38.                            ("_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))
  39.                              ((0 -1)(0.707 -0.707))((0.707 -0.707)(1 0)) ((1 0) (0.707 0.707))((0.707 0.707) (0 1)))
  40.                            ("_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))
  41.                              ((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)))
  42.                            ("_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)))
  43.                            ("_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)))
  44.                            ("_INS," ((-1 1)(-1 -0.1))((-1 -0.1)(0 -0.1))((0 -0.1)(0 -1.0))((0 -1.0)(1 -1))
  45.                              ((1 -1)(1 0.1))((1 0.1)(0 0.1))((0 0.1) (0 1.0))((0 1.0)(-1 1)))
  46.                            ("_PER," ((-1 1)(-1 -1))((-1 -1)(1 -1))((0 -1)(0 0))((0 0)(-1 0)))
  47.                            ("_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))
  48.                              ((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)))
  49.                            ("_NEA," ((-1 1)(1 -1))((1 -1)(-1 -1))((-1 -1)(1 1))((1 1)(-1 1)))
  50.                            ("_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)))
  51.                            ("_EXT," ((0.1 0)(0.13 0))((0.2 0)(0.23 0))((0.3 0)(0.33 0)))
  52.                            ("_PAR" ((0 1)(-1 -1))((1 1)(0 -1)))
  53.                          )
  54.                       )
  55.                  )
  56.           )
  57.         (sldrawvecs (setq p (if p p pt)) mode size (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences *Acad*))))
  58.       )
  59.       (cond
  60.         ((= (type name) 'ENAME) (entdel name)) ;图元恢复
  61.         ((= (type name) 'PICKSET) ;选择集
  62.           (sl-sel-redrawsel name 1) ;恢复显示
  63.         )
  64.       )
  65.     )
  66.   )
  67.   (if p p pt)
  68. )
四:展示功能
下面是对一个成块的表格操作

展示了TAB键时候的效果,大家可以看到文字始终是正的;
展示了E热键对它齐线角度的效果

五:以块为基础的这个问题的集成(方法函数之二)
  1. ;;铺捉、正交移动、复制、旋转、放缩....---(一级)----
  2. ;;ss: 图块 选择集 实体 实体表 || p0:移动起点 or nil
  3. ;;(domov-os (setq ss (ssget)) p0)
  4. ;;图块返回图块 ;其他 处理后选择集
  5. ;三领设计 V3.0 Modify by 尘缘一生  QQ:15290049 2024.6.30  (精简后代码)
  6. (defun domov-os (ss p0 / e_lst p1 pt pt1 loop ang ang0 ang1 dis f3 f8 bb p10 p00 n e ee kk a b nam e1 ee)
  7.   (if (= p0 nil) (setq p0 (ssmpt ss)))
  8.   (if (null c:sl-tkgl)
  9.     (load (strcat sl-path0 "\\Support\" "sl-tkgl.VLX")) ;加载块处理集成罢了,自理
  10.   )
  11.   (setq e_lst (sysvar '("CMDECHO" "NOMUTT" "OSMODE" "ORTHOMODE")) ee (entlast))
  12.   (cond
  13.     ((and (= (type ss) 'ENAME) (/= (dxf1 ss 0) "INSERT")) ;图元
  14.       (setq e (sl-sb (ssadd ss) p0) kk t) ;sl-sb 选择集做块
  15.     )
  16.     ((and (= (type ss) 'ENAME) (= (dxf1 ss 0) "INSERT")) ;图块
  17.       (setq e ss kk nil)
  18.     )
  19.     ((= (type ss) 'LIST) ;实体表
  20.       (setq ss (sl:pickset-fromlist ss))
  21.       (setq e (sl-sb ss p0) kk t)
  22.     )
  23.     ((= (type ss) 'PICKSET) ;选择集
  24.       (if (> (sslength ss) 1)
  25.         (setq e (sl-sb ss p0) kk t)
  26.       )
  27.       (if (= (sslength ss) 1)
  28.         (progn
  29.           (setq nam (ssname ss 0))
  30.           (if (= (dxf1 nam 0) "INSERT")
  31.             (setq e nam kk nil)
  32.             (setq e (sl-sb ss p0) kk t)
  33.           )
  34.         )
  35.       )
  36.     )
  37.   )
  38.   (command "_.undo" "be")
  39.   (setvar "CMDECHO" 0)
  40.   (setvar "NOMUTT" 1)
  41.   (princ "\n->[逆转90度(TAB)/取角(A)/LIN.(E)/<-镜向->(D)/↑镜向 ↓(S)/放大(Q)/缩小(W)/大一倍(+)/小一半(-)/基点(X)/正交(F8)/扑捉(F3)](空格..复制)(左键 插入)(右键 退出)")
  42.   (setq loop t pt1 p0 p1 p0 ang 0 f8 (getvar "ORTHOMODE") f3 (getvar "OSMODE"))
  43.   (while loop
  44.     (setq bb (grread t 15 2) p00 (cadr bb))
  45.     (cond
  46.       ((equal bb '(2 6))    ;F3切换捕捉开关
  47.         (cond
  48.           ((and (< f3 16384) (/= f3 0))
  49.             (setq f3 (+ f3 16384))
  50.             (prompt "\n <对象捕捉 关>")
  51.           )
  52.           ((or (= f3 0) (>= f3 16384))
  53.             (setq f3 16383)
  54.             (prompt "\n <对象捕捉 开>")
  55.           )
  56.         )
  57.         (setvar "OSMODE" f3) (redraw)
  58.       )   
  59.       ((equal bb '(2 15))    ;F8切换正交开关
  60.         (if (= f8 0)
  61.           (progn (setq f8 1) (prompt "\n <正交 开>"))
  62.           (progn (setq f8 0) (prompt "\n <正交 关>"))
  63.         )
  64.         (setvar "ORTHOMODE" f8) (redraw)
  65.       )
  66.       ((= (car bb) 5)
  67.         (redraw)
  68.         (if (= f8 1)
  69.           (progn
  70.             (setq ang1 (angle p1 p00))
  71.             (cond
  72.               ((or (and (> ang1 pi4) (< ang1 3pi4)) (and (> ang1 5pi4) (< ang1 7pi4)))
  73.                 (setq pt (list (car p1) (cadr p00)))
  74.               )
  75.               (t
  76.                 (setq pt (list (car p00) (cadr p1)))
  77.               )
  78.             )
  79.           )
  80.           (setq pt p00)
  81.         )
  82.         (if (> (/ (distance p0 p00) (getvar "VIEWSIZE")) 0.001)
  83.           (if (and (<= f3 16384) (> f3 0))
  84.             (sl_subupd e 10 (setq pt (slosnappt e pt)))
  85.             (sl_subupd e 10 pt)
  86.           )
  87.         )
  88.         (setq p0 pt)
  89.       )
  90.       ((member bb '((2 9)))  ;;table 键
  91.         (setq ang (+ ang pi2))
  92.         (sl_subupd e 50 ang)
  93.         (setq e (blkwzgz e)) ;块内文字实体角度归正,余同
  94.       )
  95.       ((member bb '((2 65) (2 97)))   ;;A 旋转定角
  96.         (redraw e 2)
  97.         (sl_subupd e 50 0)
  98.         (setq a (car (ebox4 e)))
  99.         (setq b (polar a 0 500))
  100.         (command ".rotate" e "" "_non" a "r" "_non" a (polar pt (angle pt b) (distance pt b)) pause)
  101.         (setq e (blkwzgz e))
  102.       )
  103.       ((member bb '((2 69) (2 101)))   ;;E e 齐线
  104.         (setq e1 (car (setq ee (entsel "\n -->请选择要对齐的实体"))))
  105.         (setq ang (e-ang e1 (cadr ee)))
  106.         (sl_subupd e 50 ang)
  107.         (setq e (blkwzgz e))
  108.       )
  109.       ((member bb '((2 115) (2 83)))  ;;S s 上下翻
  110.         (command "mirror" e "" "_non" pt (mapcar '- pt '(1 0)) "Y")
  111.         (setq e (blkwzgz e))
  112.       )
  113.       ((member bb '((2 100) (2 68))) ;;D d 左右翻
  114.         (command "mirror" e "" "_non" pt (mapcar '- pt '(0 1)) "Y")
  115.         (setq e (blkwzgz e))
  116.       )
  117.       ((or (member bb '((2 13))) (= (car bb) 3));;左键、回车
  118.         (command "copy" e "" "_non" '(0 0) "_non" '(0 0))
  119.         (setq e (entlast) p10 (dxf1 e 10))
  120.         (setq ang0 (angle pt1 p10) dis (distance pt1 p10) pt1 p10)
  121.       )
  122.       ((and ang0 dis (member bb '((2 32)))) ;;空格键
  123.         (sl_subupd e 10 (setq p10 (polar p10 ang0 dis)))
  124.         (setq pt1 p10)
  125.         (command "copy" e "" "_non" '(0 0) "_non" '(0 0))
  126.         (setq e (entlast))
  127.       )
  128.       ((member bb '((2 87) (2 119)))         ;;缩小  W w
  129.         (command "scale" e "" "_non" pt "0.9")
  130.       )
  131.       ((member bb '((2 81) (2 113)))         ;;放大  Q q
  132.         (command "scale" e "" "_non" pt "1.1")
  133.       )
  134.       ((equal bb '(2 45))         ;;缩小一半 -
  135.         (command "scale" e "" "_non" pt "0.5")
  136.       )
  137.       ((member bb '((2 43) (2 61))) ;;放大一倍 +
  138.         (command "scale" e "" "_non" pt "2.0")
  139.       )
  140.       ((member bb '((2 88) (2 120)))  ;;基点 X x
  141.         (setq p0 (getpoint "\n 基点"))
  142.         (sl-blockbaseedit e p0)
  143.       )
  144.       ((or t (member (car bb) '(11 25)));;右键 其余键
  145.         (entdel e)
  146.         (setq loop nil)
  147.       )
  148.     )
  149.   )
  150.   (setq s (last_ent ee))
  151.   (if (= kk t) ;非块
  152.     (repeat (setq n (sslength s))
  153.       (vl-catch-all-apply 'exp-blk (list (ssname s (setq n (1- n))))) ;炸块集成,求得最后结果同
  154.     )
  155.   )
  156.   (command "_.undo" "e")
  157.   (mapcar 'eval e_lst)
  158.   ss
  159. )


三领设计 V3.0 永久下载地址:
链接:https://pan.baidu.com/s/1Gi84E8KkAfCwG3JJo1bDOg
提取码:2jsu

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tranque + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-6-30 18:00:04 | 显示全部楼层
还好c#没有这个烦恼,直接用键盘钩子想怎么玩怎么玩...

点评

各种语言各有优点,但是,首先代码能没有CAD版本限制的,才是最适合学的语言,反之,再高级也是无用的东西!  发表于 2024-7-1 00:44
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-30 07:53:41 | 显示全部楼层
不要是试图用grread函数去搞捕捉了,捕捉的点 都是不精准 的点
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-7-3 00:11:16 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-7-3 00:13 编辑
dtucad 发表于 2024-7-2 23:53
凑热闹(动图有点大,耐心等待)
纯LSP重写带捕捉的grread,支持各种捕捉(含象限点)、极轴、正交、 ...

你弄好了代码了?我还在考虑,今天又改写了下子,
我那边开了个新帖,为解决这个问题
我没有在函数本身解决问题,构造了个外壳,
  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. ;;三领设计 尘缘一生 QQ:15290049
  58. (defun slosnappt (name pt / p0 p1 p2 newe ss size k)
  59.   (if (< (getvar "OSMODE") 16384) ;;打开捕捉
  60.     (progn
  61.       (if name (progn (sl-sel-redrawsel name 2) (setq k t))) ;隐藏
  62.       (if (setq newe (car (nentselp pt)))
  63.         (progn
  64.           (setq size (* (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))) (getvar "PICKBOX"))
  65.             p0 (e9pt newe 5)
  66.             ss (ssget "C" (polar p0 5pi4 size) (polar p0 pi4 size))
  67.           )
  68.           (if (or (null ss) (and ss (< (sslength ss) 2)))
  69.             (progn
  70.               (setq p1 (polar p0 pi size) p2 (polar p0 0 size))
  71.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d")))
  72.               (setq p1 (polar p0 pi2 size) p2 (polar p0 3pi2 size))
  73.               (entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2) (cons 8 "f-i-n-d")))
  74.             )
  75.           )
  76.         )
  77.       )
  78.       (vl-catch-all-apply '(lambda () (setq pt (sl-osnappt pt))))
  79.       (if k (sl-sel-redrawsel name 1)) ;恢复显示
  80.     )
  81.   )
  82.   pt
  83. )


本帖子中包含更多资源

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

x
发表于 2024-6-30 07:47:49 | 显示全部楼层
厉害,这么早就开始研究了

点评

三领,再31年前就积累了,可能学生还没上学奥?  发表于 2024-7-1 00:45
发表于 2024-6-30 09:28:08 | 显示全部楼层
grread捕捉没有问题,都是精准的
 楼主| 发表于 2024-6-30 09:45:11 | 显示全部楼层
小菜123 发表于 2024-6-30 09:28
grread捕捉没有问题,都是精准的

对,只是函数需要改进即可。
发表于 2024-6-30 14:23:51 | 显示全部楼层
小菜123 发表于 2024-6-30 09:28
grread捕捉没有问题,都是精准的

你这么牛笔,你封装一个函数,我试试学习。我用了大佬很多的封装的,不停地放大,最后都是不精准的。你能比leemac  gul还厉害

点评

我用的leemac改的,可能跟你的测试方法不一样?  发表于 2024-6-30 14:39
发表于 2024-6-30 14:50:35 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2024-6-30 15:03:22 | 显示全部楼层
顺路演示一下极轴追踪:

本帖子中包含更多资源

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

x

点评

关键看疗效  发表于 2024-7-1 08:57
lee mac 的还是建议大师不要用,代码太罗嗦了,外国人,脑子都有点问题,没灵动性。  发表于 2024-7-1 00:47
发表于 2024-6-30 16:11:57 | 显示全部楼层

你把图形放大到极限试试,顶点堆到一起试试,你看看还能不能精准

点评

equal判断相等了,我就认为对的  发表于 2024-7-1 08:58
暂且存疑即可,这个问题应该不是问题,能做到准确的,本坛只不过没有透露出来,需要我们改进罢了。  发表于 2024-7-1 00:49
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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