明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1621|回复: 38

[提问] 8向滑动圆盘grvecs做的,麻烦路过的大神帮优化一下

[复制链接]
发表于 2023-11-30 17:32 | 显示全部楼层 |阅读模式

8向滑动圆盘grvecs做的,可以根据鼠标在不同的方向滑出,实现不同的功能。圆盘大小是根据屏幕高度百分比定的,可以自行修改。
仿Solidworks右键圆盘……
我平时工作主要使用Creo和SolidWorks,CAD用来出工程图。
平时一直在群里潜水,发言不多,但也喜欢翻翻聊天记录,总会有所收获。
程序也算不算是是自己写的,都是借用个大师的代码,也非常感谢各位大神的热心指点。
代码是用记事本东拼西凑在一起,拼得很不雅观,还望海涵。
程序的最终功能尚未完成,但是整体结构已定型,最后是改成通用函数的。
代码很拙,恳请路过的大神帮忙优化一下,不胜感激

(defun c:1w(/ ang bl i p0
                     p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20
                     p21 p22 p23 p24 p25 p26 p27 p28 p29 p30 p31 p32 p33 p34 p35 p36 p37 p38 p39 p40
                     s1 s2 s3 s4 s5 s6 s7 s8
                     c1 c2 c3 c4 c5 c6 c7 c8)
  (if (setq p0 (getpoint "\n 请指定第一点:"))
    (progn
(setq sx 160 cx 150 jl 0.08)

(setq loop t)
(while loop
(setq gr (grread t 8) aj (car gr) jp (cadr gr) pj (distance p0 jp))

(cond
((= aj 3) (setq loop nil) (setq aj "左键") )
((= aj 25) (setq loop nil) (setq aj "右键") )
((= aj 5)

(setq gbfwj (atof (R2dms (jsfwj p0 jp)) ) )
(cond
((and (> gbfwj 67.5) (< gbfwj 112.5)) (setq s1 6 c1 s1 c8 s1))
((and (> gbfwj 22.5) (< gbfwj 67.5)) (setq s2 6 c2 s2 c1 s2))
((or(and (> gbfwj 0) (< gbfwj 22.5))(and (> gbfwj 0) (< gbfwj 337.5)) ) (setq s3 6 c3 s3 c4 s3))
((and (> gbfwj 292.5) (< gbfwj 337.5)) (setq s4 6 c4 s4 c5 s4))
((and (> gbfwj 247.5) (< gbfwj 229.5)) (setq s5 6 c5 s5 c6 s5))
((and (> gbfwj 202.5) (< gbfwj 247.5)) (setq s6 6 c6 s6 c7 s6))
((and (> gbfwj 157.5) (< gbfwj 202.5)) (setq s7 6 c7 s7 c8 s7))
((and (> gbfwj 112.5) (< gbfwj 157.5)) (setq s8 6 c8 s8 c1 s8))
)

(if (= s1 nil) (setq s1 sx))
(if (= s2 nil) (setq s2 sx))
(if (= s3 nil) (setq s3 sx))
(if (= s4 nil) (setq s4 sx))
(if (= s5 nil) (setq s5 sx))
(if (= s6 nil) (setq s6 sx))
(if (= s7 nil) (setq s7 sx))
(if (= s8 nil) (setq s8 sx))

(if (= c1 nil) (setq c1 cx))
(if (= c2 nil) (setq c2 cx))
(if (= c3 nil) (setq c3 cx))
(if (= c4 nil) (setq c4 cx))
(if (= c5 nil) (setq c5 cx))
(if (= c6 nil) (setq c6 cx))
(if (= c7 nil) (setq c7 cx))
(if (= c8 nil) (setq c8 cx))

      (setq bl (*(getvar'viewsize)jl))
      (setq ang (/ pi 40) i 1)
      (setq p1 (polar p0 ang bl))
      (setq p2 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p3 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p4 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p5 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p6 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p7 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p8 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p9 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p10 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p11 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p12 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p13 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p14 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p15 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p16 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p17 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p18 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p19 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p20 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p21 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p22 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p23 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p24 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p25 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p26 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p27 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p28 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p29 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p30 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p31 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p32 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p33 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p34 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p35 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p36 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p37 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p38 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p39 (polar p0(* ang(setq i(+ i 2)))bl))
      (setq p40 (polar p0(* ang(setq i(+ i 2)))bl))

(grvecs (list

s1  p1 p2
s1  p2 p3
c1  p0 p3

s2  p3 p4
s2  p4 p5
s2  p5 p6
s2  p6 p7
s2  p7 p8
c2  p0 p8

s3  p8 p9
s3  p9 p10
s3  p10 p11
s3  p11 p12
s3  p12 p13
c3  p0 p13

s4  p13 p14
s4  p14 p15
s4  p15 p16
s4  p16 p17
s4  p17 p18
c4  p0 p18

s5  p18 p19
s5  p19 p20
s5  p20 p21
s5  p21 p22
s5  p22 p23
c5  p0 p23

s6  p23 p24
s6  p24 p25
s6  p25 p26
s6  p26 p27
s6  p27 p28
c6  p0 p28

s7  p28 p29
s7  p29 p30
s7  p30 p31
s7  p31 p32
s7  p32 p33
c7  p0 p33

s8  p33 p34
s8  p34 p35
s8  p35 p36
s8  p36 p37
s8  p37 p38
c8  p0 p38

s1  p38 p39
s1  p39 p40
s1  p40 p1

))

(if (> pj (*(getvar'viewsize)jl))
(setq loop nil aj "移动鼠标")
)

)
)

);while
(redraw) ;更新
)
);if

)

(defun R2dms(r / zd d m s)
  (setq zd (/ (* r 180) pi))
  (setq        d (fix zd)
        m (fix (* 60 (- zd d)))
        s (* (- (* 60 (- zd d)) m) 60)
  )
;(strcat (itoa d) "度" (itoa m) "分" (rtos s 2 2) "秒")
;(setq x 180)(while (>= zd x) (setq        zd (- zd x)))
(strcat  (rtos zd) "°" ;(itoa m) "'" (rtos s 2 2) "\" "
)
)

;计算坐标方位角函数 lishucheng96 2018-1-7 http://bbs.mjtd.com/forum.php?mo ... amp;_dsign=02446516
(defun jsfwj(pt1 pt2 / dxy fwj)
(setq dxy (mapcar '- pt2 pt1))
(setq fwj (atan (car dxy) (cadr dxy)))
(if (< fwj 0) (setq fwj (+ fwj (* 2 pi))))
fwj
)






本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
仲文玉 + 1 鼓励一下

查看全部评分

发表于 2023-11-30 20:38 | 显示全部楼层
  1. (defun c:1w (/ aj an an0 bl cx gr jl jp lm-get-circlepts-pt1 loop p0 pj sx)
  2.         (defun lm-get-circlepts-pt1 (pt10 bj an0 co / an an1 d pt pt1)
  3.                 (setq d (/ 360.0 8))
  4.                 (setq an (+ an0 (* pi 0.25)))
  5.                 (setq an1 an0)
  6.                 (setq pt (polar pt10 an1 bj))
  7.                 (grdraw pt10 pt co)
  8.                 (setq pt (polar pt10 an bj))
  9.                 (grdraw pt10 pt co)
  10.                 (repeat 4
  11.                         (setq pt (polar pt10 an1 bj))
  12.                         (setq pt1 pt)
  13.                         (setq an1 (+ an1 (* (/ (/ 360.0 32) 180.0) pi)))
  14.                         (setq pt (polar pt10 an1 bj))
  15.                         (grdraw pt1 pt co)
  16.                 )
  17.         )
  18.         (if (setq p0 (getpoint "\n请指定第一点:"))
  19.     (progn
  20.                         (setq sx 6 cx 4 jl 0.4)
  21.                         (setq loop t)
  22.                         (while loop
  23.                                 (setq gr (grread t 8) aj (car gr) jp (cadr gr))
  24.                                 (cond
  25.                                         ((= aj 3) (setq loop nil) (redraw) (setq aj "左键") )
  26.                                         ((= aj 25) (setq loop nil) (redraw) (setq aj "右键") )
  27.                                         ((= aj 5)
  28.                                                 (redraw)
  29.                                                 (setq pj (distance p0 jp))
  30.                                                 (setq bl (*(getvar'viewsize)jl))
  31.                                                 (setq an0 (* pi 1.875))
  32.                                                 (repeat 8
  33.                                                         (lm-get-circlepts-pt1 p0 bl an0 cx)
  34.                                                         (setq an0 (+ an0 (* pi 0.25)))
  35.                                                 )
  36.                                                 (setq an (angle p0 jp))
  37.                                                 (cond
  38.                                                         ((< (* pi 0.125) an (* pi 0.375)) (lm-get-circlepts-pt1 p0 bl (* pi 0.125) sx))
  39.                                                         ((< (* pi 0.375) an (* pi 0.625)) (lm-get-circlepts-pt1 p0 bl (* pi 0.375) sx))
  40.                                                         ((< (* pi 0.625) an (* pi 0.875)) (lm-get-circlepts-pt1 p0 bl (* pi 0.625) sx))
  41.                                                         ((< (* pi 0.875) an (* pi 1.125)) (lm-get-circlepts-pt1 p0 bl (* pi 0.875) sx))
  42.                                                         ((< (* pi 1.125) an (* pi 1.375)) (lm-get-circlepts-pt1 p0 bl (* pi 1.125) sx))
  43.                                                         ((< (* pi 1.375) an (* pi 1.625)) (lm-get-circlepts-pt1 p0 bl (* pi 1.375) sx))
  44.                                                         ((< (* pi 1.625) an (* pi 1.875)) (lm-get-circlepts-pt1 p0 bl (* pi 1.625) sx))
  45.                                                         ((or (<= (* pi 1.875) an (* pi 2)) (<= 0 an (* pi 0.125)))(lm-get-circlepts-pt1 p0 bl (* pi 1.875) sx))
  46.                                                 )
  47.                                                 (if (> pj (*(getvar'viewsize)jl))
  48.                                                         (setq loop nil aj "移动鼠标")
  49.                                                 )
  50.                                         )
  51.                                 )
  52.                         )
  53.                 )
  54.         )
  55.         (princ)
  56. )

评分

参与人数 3明经币 +3 收起 理由
bssurvey + 1 赞一个!
lee50310 + 1 赞一个!
努.力 + 1 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2023-12-3 15:26 | 显示全部楼层
  1. (defun c:x(/ a)
  2.         (setq
  3.                 a (diy 0.2 "爽歪歪" "←" "→" "↑" "↓" "↖" "↗" "↙" "↘")
  4.                 ;a (strcat a "+" (diy 0.2 "爽歪歪" "←" "→" "↑" "↓" "↖" "↗" "↙" "↘"));套娃
  5.         )
  6.         (princ a)
  7.         (princ)
  8. )

  9. ;(diy 0.07 ts 左滑 右滑 上滑 下滑 左上滑 右上滑  左下滑 右下滑)
  10. (defun diy(bs ts fx_z fx_y fx_s fx_x fx_zs fx_ys fx_zx fx_yx / *error* n an an0 bl gr jp grdral loop p0 pj xc gc hd aj)
  11.         (defun *error*(msg / *error*);出错处理
  12.                 (setvar'cursorsize gb);恢复光标大小
  13.                 (setvar'pickbox bk);恢复靶框大小
  14.                 (redraw);更新
  15.                 (setq aj nil)
  16.         )
  17.         ;飞雪神光 2023-11-30 http://bbs.mjtd.com/thread-188998-1-1.html
  18.         ;矢量线
  19.         ;(grvecs (list 颜色 点 点 颜色 点 点))
  20.         ;矢量线
  21.         ;(grdraw 点 长度 角度 颜色)
  22.         (defun grdral(pt10 bj an0 co / an an1 pt pt1)
  23.                 (setq
  24.                         an (+ an0 (/ pi (/ n 2)))
  25.                         an1 an0
  26.                         pt (polar pt10 an1 bj)
  27.                 )
  28.                 (grdraw pt10 pt co)
  29.                 (setq pt (polar pt10 an bj))
  30.                 (grdraw pt10 pt co)
  31.                 (repeat (/ n 2)
  32.                         (setq
  33.                                 pt (polar pt10 an1 bj)
  34.                                 pt1 pt
  35.                                 an1 (+ an1 (* (/ (/ 360.0 32) 180.0) pi))
  36.                                 pt (polar pt10 an1 bj)
  37.                         )
  38.                         (grdraw pt1 pt co);滑盘外圈颜色
  39.                 )
  40.         )
  41.         ;————————————————————
  42.         (if(= bs "")(setq bs 0.07)) ;屏幕高度的倍数
  43.         (setq
  44.                 n 8 ;滑盘等分数
  45.                 xc 160 ;非光标处滑盘颜色
  46.                 gc 6 ;光标处滑盘颜色
  47.                 p0 (cadr (grread *));滑盘中心点
  48.                 gb (getvar'cursorsize);记录光标大小
  49.                 bk (getvar'pickbox);记录靶框大小
  50.                 loop t
  51.                 princpd t
  52.                 princpd1 1
  53.                 princpd2 2
  54.         )
  55.         (setvar'cursorsize 1);设置光标大小
  56.         (setvar'pickbox 1);设置靶框大小
  57.         ;————————————————————鼠标移动前绘制滑盘
  58.         (setq an0 (* pi 1.875))
  59.         (repeat n
  60.                 (grdral p0 (*(getvar'viewsize)bs) an0 3)
  61.                 (setq an0 (+ an0 (/ pi (/ n 2))))
  62.         )
  63.         (princ (setq ts (strcat ts " 左滑:" fx_z " 右滑:" fx_y " 上滑:" fx_s " 下滑:" fx_x " 左上滑:" fx_zs " 右上滑:" fx_ys " 左下滑:" fx_zx " 右下滑:" fx_yx)));提示
  64.         ;————————————————————
  65.         (while loop
  66.                 ;(if(/= ss "")(sssetfirst()ss));如果已选中对象则亮显它
  67.                 (setq
  68.                         gr (grread t 8)
  69.                         aj0 (car gr)
  70.                         jp (cadr gr)
  71.                 )
  72.                 (cond
  73.                         ((= aj0 3) (setq loop nil) (setq aj "左键") )
  74.                         ((= aj0 25) (setq loop nil) (setq aj "右键") )
  75.                         ((= aj0 5) ;移动鼠标触发距离
  76.                                 (setq
  77.                                         bl (*(getvar'viewsize)bs);滑盘大小(屏幕高度×倍数)
  78.                                         pj (distance p0 jp)
  79.                                 )
  80.                                 (if (> pj (* bl 0.07))
  81.                                         (progn
  82.                                                 (redraw);更新
  83.                                                 ;————————————————————鼠标移动后绘制滑盘
  84.                                                 (setq an0 (* pi 1.875))
  85.                                                 (repeat n
  86.                                                         (grdral p0 bl an0 xc);非光标处滑盘颜色
  87.                                                         (setq an0 (+ an0 (/ pi (/ n 2))))
  88.                                                 )
  89.                                                 (grdraw p0 jp 1);光标引线
  90.                                                 ;————————————————————8向滑动判断
  91.                                                 (setq ts1 (strcat "\n " ts)) ;提示
  92.                                                 (setq an (angle p0 jp))
  93.                                                 ;(vl-string-subst "替换后的文字" "要替换的文字" wz);字符串替换,替换wz里指定的字符串
  94.                                                 ;(print (list princpd1 princpd2))
  95.                                                 (cond
  96.                                                         ((< (* pi 0.125) an (* pi 0.375))
  97.                                                                 (grdral p0 bl (* pi 0.125) gc) (setq hd "右上滑")
  98.                                                                 (if (/= fx_ys "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_ys) ts1)))
  99.                                                                 (if (= princpd1 princpd2)
  100.                                                                         (if princpd
  101.                                                                                 (progn
  102.                                                                                         ;(princ (strcat "\n " ts1 "\n " hd ":" fx_ys))
  103.                                                                                         (princ (strcat "\n " hd ":" fx_ys))
  104.                                                                                         (setq princpd nil)
  105.                                                                                 )
  106.                                                                         )
  107.                                                                         (setq princpd t princpd1 princpd2)
  108.                                                                 )
  109.                                                                 (setq princpd2 1)
  110.                                                         );↗
  111.                                                         ((< (* pi 0.375) an (* pi 0.625))
  112.                                                                 (grdral p0 bl (* pi 0.375) gc) (setq hd "上滑")
  113.                                                                 (if (/= fx_s "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_s) ts1)))
  114.                                                                 (if (= princpd1 princpd2)
  115.                                                                         (if princpd
  116.                                                                                 (progn
  117.                                                                                         ;(princ (strcat "\n " ts1 "\n " hd ":" fx_s))
  118.                                                                                         (princ (strcat "\n " hd ":" fx_s))
  119.                                                                                         (setq princpd nil)
  120.                                                                                 )
  121.                                                                         )
  122.                                                                         (setq princpd t princpd1 princpd2)
  123.                                                                 )
  124.                                                                 (setq princpd2 2)
  125.                                                         );↑
  126.                                                         ((< (* pi 0.625) an (* pi 0.875))
  127.                                                                 (grdral p0 bl (* pi 0.625) gc) (setq hd "左上滑")
  128.                                                                 (if (/= fx_zs "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_zs) ts1)))
  129.                                                                 (if (= princpd1 princpd2)
  130.                                                                         (if princpd
  131.                                                                                 (progn
  132.                                                                                         (princ (strcat "\n "  hd ":" fx_zs))
  133.                                                                                         (setq princpd nil)
  134.                                                                                 )
  135.                                                                         )
  136.                                                                         (setq princpd t princpd1 princpd2)
  137.                                                                 )
  138.                                                                 (setq princpd2 3)
  139.                                                         );↖
  140.                                                         ((< (* pi 0.875) an (* pi 1.125))
  141.                                                                 (grdral p0 bl (* pi 0.875) gc) (setq hd "左滑")
  142.                                                                 (if (/= fx_z "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_z) ts1)))
  143.                                                                 (if (= princpd1 princpd2)
  144.                                                                         (if princpd
  145.                                                                                 (progn
  146.                                                                                         (princ (strcat "\n " hd ":" fx_z))
  147.                                                                                         (setq princpd nil)
  148.                                                                                 )
  149.                                                                         )
  150.                                                                         (setq princpd t princpd1 princpd2)
  151.                                                                 )
  152.                                                                 (setq princpd2 4)
  153.                                                         );←
  154.                                                         ((< (* pi 1.125) an (* pi 1.375))
  155.                                                                 (grdral p0 bl (* pi 1.125) gc) (setq hd "左下滑")
  156.                                                                 (if (/= fx_zx "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_zx) ts1)))
  157.                                                                 (if (= princpd1 princpd2)
  158.                                                                         (if princpd
  159.                                                                                 (progn
  160.                                                                                         (princ (strcat "\n " hd ":" fx_zx))
  161.                                                                                         (setq princpd nil)
  162.                                                                                 )
  163.                                                                         )
  164.                                                                         (setq princpd t princpd1 princpd2)
  165.                                                                 )
  166.                                                                 (setq princpd2 5)
  167.                                                         );↙
  168.                                                         ((< (* pi 1.375) an (* pi 1.625))
  169.                                                                 (grdral p0 bl (* pi 1.375) gc) (setq hd "下滑")
  170.                                                                 (if (/= fx_x "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_x) ts1)))
  171.                                                                 (if (= princpd1 princpd2)
  172.                                                                         (if princpd
  173.                                                                                 (progn
  174.                                                                                         (princ (strcat "\n " hd ":" fx_x))
  175.                                                                                         (setq princpd nil)
  176.                                                                                 )
  177.                                                                         )
  178.                                                                         (setq princpd t princpd1 princpd2)
  179.                                                                 )
  180.                                                                 (setq princpd2 6)
  181.                                                         );↓
  182.                                                         ((< (* pi 1.625) an (* pi 1.875))
  183.                                                                 (grdral p0 bl (* pi 1.625) gc) (setq hd "右下滑")
  184.                                                                 (if (/= fx_yx "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_yx) ts1)))
  185.                                                                 (if (= princpd1 princpd2)
  186.                                                                         (if princpd
  187.                                                                                 (progn
  188.                                                                                         (princ (strcat "\n " hd ":" fx_yx))
  189.                                                                                         (setq princpd nil)
  190.                                                                                 )
  191.                                                                         )
  192.                                                                         (setq princpd t princpd1 princpd2)
  193.                                                                 )
  194.                                                                 (setq princpd2 7)
  195.                                                         );↘
  196.                                                         ((or (<= (* pi 1.875) an (* pi 2)) (<= 0 an (* pi 0.125)))(grdral p0 bl (* pi 1.875) gc) (setq hd "右滑")
  197.                                                                 (if (/= fx_y "") (setq ts1 (vl-string-subst "" (strcat " " hd ":" fx_y) ts1)))
  198.                                                                 (if (= princpd1 princpd2)
  199.                                                                         (if princpd
  200.                                                                                 (progn
  201.                                                                                         (princ (strcat "\n " hd ":" fx_y))
  202.                                                                                         (setq princpd nil)
  203.                                                                                 )
  204.                                                                         )
  205.                                                                         (setq princpd t princpd1 princpd2)
  206.                                                                 )
  207.                                                                 (setq princpd2 8)
  208.                                                         );→
  209.                                                 );————————————————————
  210.                                                 (if (> pj (* (* (getvar 'viewsize) bs) 1))
  211.                                                         (progn ;光标离开滑盘
  212.                                                                 (setq loop nil)
  213.                                                                 (setvar'cursorsize gb);恢复光标大小
  214.                                                                 (setvar'pickbox bk);恢复靶框大小
  215.                                                                 (redraw);更新
  216.                                                         )
  217.                                                 )
  218.                                         )
  219.                                  (setq aj ":盘外")
  220.                                 )
  221.                         );————————————————————移动鼠标结束
  222.                         ;————————————————————按键盘(grread)
  223.                         ((= aj0 2)
  224.                                 (setq loop nil)
  225.                                 (cond
  226.                                         ((= jp 96) (setq aj "`"))
  227.                                         ((or(= jp 113)(= jp 81)) (setq aj "q"))
  228.                                         ((or(= jp 119)(= jp 87)) (setq aj "w"))
  229.                                         ((or(= jp 101)(= jp 69)) (setq aj "e"))
  230.                                         ((or(= jp 114)(= jp 82)) (setq aj "r"))
  231.                                         ((or(= jp 116)(= jp 84)) (setq aj "t"))
  232.                                         ((or(= jp 121)(= jp 89)) (setq aj "y"))
  233.                                         ((or(= jp 117)(= jp 85)) (setq aj "u"))
  234.                                         ((or(= jp 105)(= jp 73)) (setq aj "i"))
  235.                                         ((or(= jp 111)(= jp 79)) (setq aj "o"))
  236.                                         ((or(= jp 112)(= jp 80)) (setq aj "p"))
  237.                                         ((= jp 91) (setq aj "["))
  238.                                         ((= jp 93) (setq aj "]"))
  239.                                         ((= jp 8) (setq aj "删除")) ;Backspace
  240.                                         ((= jp 61) (setq aj "="))
  241.                                         ((or(= jp 97)(= jp 65)) (setq aj "a"))
  242.                                         ((or(= jp 115)(= jp 83)) (setq aj "s"))
  243.                                         ((or(= jp 100)(= jp 68)) (setq aj "d"))
  244.                                         ((or(= jp 102)(= jp 70)) (setq aj "f"))
  245.                                         ((or(= jp 103)(= jp 71)) (setq aj "g"))
  246.                                         ((or(= jp 104)(= jp 72)) (setq aj "h"))
  247.                                         ((or(= jp 106)(= jp 74)) (setq aj "j"))
  248.                                         ((or(= jp 107)(= jp 75)) (setq aj "k"))
  249.                                         ((or(= jp 108)(= jp 76)) (setq aj "l"))
  250.                                         ((= jp 59) (setq aj ";"))
  251.                                         ((= jp 39) (setq aj "'"))
  252.                                         ((or(= jp 122)(= jp 90)) (setq aj "z"))
  253.                                         ((or(= jp 120)(= jp 88)) (setq aj "x"))
  254.                                         ((or(= jp 99)(= jp 67)) (setq aj "c"))
  255.                                         ((or(= jp 118)(= jp 86)) (setq aj "v"))
  256.                                         ((or(= jp 98)(= jp 66)) (setq aj "b"))
  257.                                         ((or(= jp 110)(= jp 78)) (setq aj "n"))
  258.                                         ((or(= jp 109)(= jp 77)) (setq aj "m"))
  259.                                         ((= jp 44) (setq aj ","))
  260.                                         ((= jp 92) (setq aj "\\"))
  261.                                         ((= jp 13) (setq aj "回车"))
  262.                                         ((= jp 32) (setq aj "空格"))
  263.                                         ((= jp 46) (setq aj "."))
  264.                                         ((= jp 48) (setq aj 0))
  265.                                         ((= jp 49) (setq aj 1))
  266.                                         ((= jp 50) (setq aj 2))
  267.                                         ((= jp 51) (setq aj 3))
  268.                                         ((= jp 52) (setq aj 4))
  269.                                         ((= jp 53) (setq aj 5))
  270.                                         ((= jp 54) (setq aj 6))
  271.                                         ((= jp 55) (setq aj 7))
  272.                                         ((= jp 56) (setq aj 8))
  273.                                         ((= jp 57) (setq aj 9))
  274.                                         ((= jp 43) (setq aj "+"))
  275.                                         ((= jp 45) (setq aj "-"))
  276.                                         ((= jp 42) (setq aj "*"))
  277.                                         ((= jp 47) (setq aj "/"))
  278.                                         ((= jp 9) (setq aj "Tab")) ;Tab
  279.                                         ;————————————————————Shift+
  280.                                         ((= jp 123) (setq aj "{"))
  281.                                         ((= jp 125) (setq aj "}"))
  282.                                         ((= jp 58) (setq aj ":"))
  283.                                         ((= jp 34) (setq aj "\""))
  284.                                         ((= jp 60) (setq aj "<"))
  285.                                         ((= jp 62) (setq aj ">"))
  286.                                         ((= jp 63) (setq aj "?"))
  287.                                         ((= jp 124) (setq aj "|"))
  288.                                         ((= jp 126) (setq aj "~"))
  289.                                         ((= jp 33) (setq aj "!"))
  290.                                         ((= jp 64) (setq aj "@"))
  291.                                         ((= jp 35) (setq aj "#"))
  292.                                         ((= jp 36) (setq aj "$"))
  293.                                         ((= jp 37) (setq aj "%"))
  294.                                         ((= jp 94) (setq aj "^"))
  295.                                         ((= jp 38) (setq aj "&"))
  296.                                         ((= jp 40) (setq aj "("))
  297.                                         ((= jp 41) (setq aj ")"))
  298.                                         ((= jp 95) (setq aj "_"))
  299.                                 )
  300.                         )
  301.                 )
  302.         );while
  303.         (setvar'cursorsize gb);恢复光标大小
  304.         (setvar'pickbox bk);恢复靶框大小
  305.         (redraw);更新
  306.         (if hd (setq aj (strcat hd aj)))
  307.         (princ "\n")
  308.         aj
  309. )
回复 支持 1 反对 0

使用道具 举报

发表于 2023-12-3 15:06 | 显示全部楼层
随便写了一个,可能与你的思路不一样
  1. (defun grrev (/             ANG    ANG0   CODE          FANGWEI        LOOP   PT
  2.               PT0    QUYU   REV           SCALE  TS         TS1        TS2    TS3
  3.               TS4    TS5    TS6           TS7          TS8         YUANPAN
  4.              )
  5.   (defun mat_mxv (m v /)
  6.     (mapcar '(lambda (r) (apply '+ (mapcar '* r v)))
  7.             m
  8.     )
  9.   )
  10.   (defun mat_trp (m /)
  11.     (apply 'mapcar (cons 'list m))
  12.   )
  13.   (defun mat_cen (m q /)
  14.     (mapcar '(lambda (r)
  15.                (mat_mxv (mat_trp q) r)
  16.              )
  17.             m
  18.     )
  19.   )
  20.   (setq        yuanpan        '(5
  21.                   (0.0 0.0 0.0)
  22.                   (0.915327 -0.379141 0.0)
  23.                   (-0.379141 0.915327 0.0)
  24.                   (0.379141 -0.915327 0.0)
  25.                   (0.379141 0.915327 0.0)
  26.                   (-0.379141 -0.915327 0.0)
  27.                   (0.915327 0.379141 0.0)
  28.                   (-0.915327 -0.379141 0.0)
  29.                   (0.0 0.0 0.0)
  30.                   (-0.915327 0.379141 0.0)
  31.                   (-0.156434 0.987688)
  32.                   (-0.45399 0.891007)
  33.                   (-0.45399 0.891007)
  34.                   (-0.707107 0.707107)
  35.                   (-0.707107 0.707107)
  36.                   (-0.891007 0.45399)
  37.                   (-0.891007 0.45399)
  38.                   (-0.987688 0.156434)
  39.                   (-0.987688 0.156434)
  40.                   (-0.987688 -0.156434)
  41.                   (-0.987688 -0.156434)
  42.                   (-0.891007 -0.45399)
  43.                   (-0.891007 -0.45399)
  44.                   (-0.707107 -0.707107)
  45.                   (-0.707107 -0.707107)
  46.                   (-0.45399 -0.891007)
  47.                   (-0.45399 -0.891007)
  48.                   (-0.156434 -0.987688)
  49.                   (-0.156434 -0.987688)
  50.                   (0.156434 -0.987688)
  51.                   (0.156434 -0.987688)
  52.                   (0.45399 -0.891007)
  53.                   (0.45399 -0.891007)
  54.                   (0.707107 -0.707107)
  55.                   (0.707107 -0.707107)
  56.                   (0.891007 -0.45399)
  57.                   (0.891007 -0.45399)
  58.                   (0.987688 -0.156434)
  59.                   (0.987688 -0.156434)
  60.                   (0.987688 0.156434)
  61.                   (0.987688 0.156434)
  62.                   (0.891007 0.45399)
  63.                   (0.891007 0.45399)
  64.                   (0.707107 0.707107)
  65.                   (0.707107 0.707107)
  66.                   (0.45399 0.891007)
  67.                   (0.45399 0.891007)
  68.                   (0.156434 0.987688)
  69.                   (0.156434 0.987688)
  70.                   (-0.156434 0.987688)
  71.                  )
  72.   )
  73.   (setq        quyu '(2
  74.                (0.0 0.0 0.0)
  75.                (0.915327 -0.379141 0.0)
  76.                (0.915327 0.379141 0.0)
  77.                (-1.61054e-15 -6.67109e-16 0.0)
  78.                (0.987688 0.156434 0.0)
  79.                (0.915327 0.379141 0.0)
  80.                (0.987688 -0.156434 0.0)
  81.                (0.987688 0.156434 0.0)
  82.                (0.915327 -0.379141 0.0)
  83.                (0.987688 -0.156434 0.0)
  84.               )
  85.   )

  86.   (setq        ts1 '(1 (0.15808 -0.0956111 0.0) (0.15808 0.206223 0.0))
  87.   )
  88.   (setq        ts2 '(1
  89.               (0.223258 -0.0956111 0.0)
  90.               (0.223258 0.206223 0.0)
  91.               (0.15808 -0.0956111 0.0)
  92.               (0.15808 0.206223 0.0)
  93.              )
  94.   )
  95.   (setq        ts3 '(1
  96.               (0.288436 -0.0956111 0.0)
  97.               (0.288436 0.206223 0.0)
  98.               (0.223258 -0.0956111 0.0)
  99.               (0.223258 0.206223 0.0)
  100.               (0.15808 -0.0956111 0.0)
  101.               (0.15808 0.206223 0.0)
  102.              )
  103.   )
  104.   (setq        ts4 '(1
  105.               (0.353613 0.206223 0.0)
  106.               (0.288436 -0.0956111 0.0)
  107.               1
  108.               (0.223258 0.206223 0.0)
  109.               (0.288436 -0.0956111 0.0)
  110.               1
  111.               (0.15808 -0.0956111 0.0)
  112.               (0.15808 0.206223 0.0)
  113.              )
  114.   )
  115.   (setq        ts5 '(1
  116.               (0.288436 0.206223 0.0)
  117.               (0.223258 -0.0956111 0.0)
  118.               (0.15808 0.206223 0.0)
  119.               (0.223258 -0.0956111 0.0)
  120.              )
  121.   )
  122.   (setq        ts6 '(1
  123.               (0.353613 -0.0956111 0.0)
  124.               (0.353613 0.206223 0.0)
  125.               (0.288436 0.206223 0.0)
  126.               (0.223258 -0.0956111 0.0)
  127.               (0.15808 0.206223 0.0)
  128.               (0.223258 -0.0956111 0.0)
  129.              )
  130.   )
  131.   (setq        ts7 '(1
  132.               (0.288436 0.206223 0.0)
  133.               (0.223258 -0.0956111 0.0)
  134.               (0.15808 0.206223 0.0)
  135.               (0.223258 -0.0956111 0.0)
  136.               (0.418791 -0.0956111 0.0)
  137.               (0.418791 0.206223 0.0)
  138.               (0.353613 -0.0956111 0.0)
  139.               (0.353613 0.206223 0.0)
  140.              )
  141.   )
  142.   (setq        ts8 '(1
  143.               (0.483969 -0.0956111 0.0)
  144.               (0.483969 0.206223 0.0)
  145.               (0.288436 0.206223 0.0)
  146.               (0.223258 -0.0956111 0.0)
  147.               (0.15808 0.206223 0.0)
  148.               (0.223258 -0.0956111 0.0)
  149.               (0.418791 -0.0956111 0.0)
  150.               (0.418791 0.206223 0.0)
  151.               (0.353613 -0.0956111 0.0)
  152.               (0.353613 0.206223 0.0)
  153.              )
  154.   )



  155.   (setq pt0 (cadr (grread t)))
  156.   (setq loop t)
  157.   (while loop
  158.     (setq pt (grread t))
  159.     (setq code (car pt)
  160.           pt   (cadr pt)
  161.     )
  162.     (redraw)
  163.     (cond
  164.       ((= code 5)
  165.        (setq scale (* (getvar 'viewsize) 0.2))
  166.        (GRVECS yuanpan
  167.                (list (list scale 0 0 (car pt0))
  168.                      (list 0 scale 0 (cadr pt0))
  169.                      (list 0 0 scale 0)
  170.                      '(0 0 0 1)
  171.                )
  172.        )
  173. ;;;绘制圆盘


  174.        (setq ang (angle pt0 pt))
  175.        (setq ang0 (/ (* ang 180.0) pi))
  176.        (setq fangwei (cond
  177.                        ((<= 22.5 ang0 67.5) (setq ts ts2) 2)
  178.                        ((<= 67.5 ang0 112.5) (setq ts ts3) 3)
  179.                        ((<= 112.5 ang0 157.5) (setq ts ts4) 4)
  180.                        ((<= 157.5 ang0 202.5) (setq ts ts5) 5)
  181.                        ((<= 202.5 ang0 247.5) (setq ts ts6) 6)
  182.                        ((<= 247.5 ang0 292.5) (setq ts ts7) 7)
  183.                        ((<= 292.5 ang0 337.5) (setq ts ts8) 8)
  184.                        (t (setq ts ts1) 1)
  185.                      )
  186.        )
  187.        (setq ang0 (/ (* (1- fangwei) 45 pi) 180.0))
  188.        (GRVECS quyu
  189.                (mat_cen        (list (list scale 0 0 (car pt0))
  190.                               (list 0 scale 0 (cadr pt0))
  191.                               (list 0 0 scale 0)
  192.                               '(0 0 0 1)
  193.                         )
  194.                         (list (list (cos ang0) (* -1 (sin ang0)) 0. 0.)
  195.                               (list (sin ang0) (cos ang0) 0. 0.)
  196.                               '(0. 0. 1. 0.)
  197.                               '(0. 0. 0. 1.)
  198.                         )
  199.                )

  200.        )
  201. ;;;绘制区域

  202.        (GRVECS ts
  203.                (list (list scale 0 0 (car pt))
  204.                      (list 0 scale 0 (cadr pt))
  205.                      (list 0 0 scale 0)
  206.                      '(0 0 0 1)
  207.                )
  208.        )
  209. ;;;绘制提示
  210.        (if (> (distance pt0 pt) scale)
  211.          (setq loop nil
  212.                rev  (list 5 fangwei)
  213.          )
  214.        )
  215.       )
  216. ;;;移动鼠标
  217.       ((= code 3)
  218.        (setq ang (angle pt0 pt))
  219.        (setq ang0 (/ (* ang 180.0) pi))
  220.        (setq fangwei (cond
  221.                        ((<= 22.5 ang0 67.5) (setq ts ts2) 2)
  222.                        ((<= 67.5 ang0 112.5) (setq ts ts3) 3)
  223.                        ((<= 112.5 ang0 157.5) (setq ts ts4) 4)
  224.                        ((<= 157.5 ang0 202.5) (setq ts ts5) 5)
  225.                        ((<= 202.5 ang0 247.5) (setq ts ts6) 6)
  226.                        ((<= 247.5 ang0 292.5) (setq ts ts7) 7)
  227.                        ((<= 292.5 ang0 337.5) (setq ts ts8) 8)
  228.                        (t (setq ts ts1) 1)
  229.                      )
  230.        )
  231.        (setq loop nil
  232.              rev  (list 3 fangwei)
  233.        )
  234.       )
  235. ;;;点击鼠标左键
  236.       (t
  237.        (setq loop nil
  238.              rev  (list code pt)
  239.        )
  240.       )
  241.     )
  242.   )
  243.   (redraw)
  244.   rev
  245. )
回复 支持 1 反对 0

使用道具 举报

发表于 2023-11-30 17:55 | 显示全部楼层
搞这么复杂
精神可嘉
 楼主| 发表于 2023-11-30 19:57 | 显示全部楼层
仲文玉 发表于 2023-11-30 17:55
搞这么复杂
精神可嘉

谢谢版主捧场
发表于 2023-11-30 20:36 | 显示全部楼层
建议用.net做,lisp很难达到实用状态
 楼主| 发表于 2023-11-30 20:54 | 显示全部楼层
lijiao 发表于 2023-11-30 20:36
建议用.net做,lisp很难达到实用状态

很好用的啊,特别是当程序要选对象时,要有不同的选项,比如过滤条件,又比如机械行业里,双击一根边线,出现8向盘,在不同的方位滑出,可以标注线性、对齐、角度、表面粗糙度、基准、引线……8项不够可以套娃,8*8*8……又或者改成更多方向
 楼主| 发表于 2023-11-30 21:17 | 显示全部楼层

效果非常好,非常感谢你帮忙优化
发表于 2023-12-1 01:03 | 显示全部楼层
努.力 发表于 2023-11-30 20:54
很好用的啊,特别是当程序要选对象时,要有不同的选项,比如过滤条件,又比如机械行业里,双击一根边线, ...

人家没说不好用,用.net省10倍力,还能流畅10倍
发表于 2023-12-1 08:43 | 显示全部楼层
我个人认为,用Lisp的话,圆盘改成宫格比较容易实现,判断点在pizza里比矩形里难一些
 楼主| 发表于 2023-12-1 09:37 | 显示全部楼层
d1742647821 发表于 2023-12-1 01:03
人家没说不好用,用.net省10倍力,还能流畅10倍

呃,net如此强悍,我得努力学习啊&#128516;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 10:56 , Processed in 0.361230 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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