明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 努.力

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

[复制链接]
 楼主| 发表于 2023-12-3 19:25 | 显示全部楼层

多谢大神指点
 楼主| 发表于 2023-12-3 19:26 | 显示全部楼层

多谢大神指点
 楼主| 发表于 2023-12-3 19:29 来自手机 | 显示全部楼层
飞雪神光 发表于 2023-12-3 17:53
aj变量冲突

多谢大神指点迷津
 楼主| 发表于 2023-12-6 12:50 | 显示全部楼层
本帖最后由 努.力 于 2023-12-6 12:51 编辑

有空又折腾了一下,
1:可以设置圆盘圆周份数,并自动识别激活分区(但激活不准确,分区越多误差越大,不知怎么搞)
2:可以设置环数(水平有限,照葫芦画不出瓢),固定的,不能自动分配
待完善
1:修正(提高)自动识别分区
2:把起始角(第一区)固定为正上方
3:把环数按设定值,递减向外分布(数学太菜,只会均分或固定值)

生命不息,折腾不止……
祝不甘于平凡的你拥有与众不同的精彩……

(defun c:v(/ a)
(setq
a (diy 0.4 8 "万向滑盘")
a (strcat a "+" (diy 0.4 16 "万向滑盘"));套娃
) )

;(diy8x "" ts 左滑 右滑 上滑 下滑 左上滑 右上滑左下滑 右下滑)
(defun diy(bs n ts / *error* ss f n1 an an0 b0 b1 bl gr jp grdra_w loop p0 gb bk pj xc oc ts1 hd ja aj smx)

(if (= bs "") (setq bs 0.07)) ;屏幕高度的倍数
(if (= n "") (setq n 8)) ;滑盘等分数
(setq
b0 0.1 ;最小滑动系数
b1 1 ;离开滑盘系数,默认1
xc 160 ;非光标处滑盘颜色
oc 3 ;非光标移动滑盘颜色
p0 (cadr (grread *));滑盘中心点
gb (getvar'cursorsize);记录光标大小
bk (getvar'pickbox);记录靶框大小
f 4 ;每一分的边数
n1 (/ 1.0 n)
ss (ssget "i")
)

(setvar'cursorsize 1);设置光标大小
(setvar'pickbox 1);设置靶框大小
;————————————————————出错处理
(defun *error*(msg / *error*)
(setvar'cursorsize gb);恢复光标大小
(setvar'pickbox bk);恢复靶框大小
(redraw);更新
(setq aj nil hd nil) )
;————————————————————
;飞雪神光 2023-12-3 http://bbs.mjtd.com/forum.php?mo ... 98&page=2#pid964923
;矢量线
;(grvecs (list 颜色 点 点 颜色 点 点))
;矢量线
;(grdraw 点 点 颜色)
;(grdraw 点 长度 角度 颜色)
(defun grdra_w(pt10 bj an0 co / an an1 pt pt1)
(setq
an (+ an0 (/ pi (/ n 2)))
an1 an0
pt (polar pt10 an1 bj)
)
(grdraw pt10 pt co)
(setq pt (polar pt10 an bj))
(grdraw pt10 pt co)
(repeat f
(setq
pt (polar pt10 an1 bj)
pt1 pt
an1 (+ an1 (* pi (/ (/ 360.0 (* f n))180.0)))
pt (polar pt10 an1 bj)
)
(grdraw pt1 pt co);滑盘外圈颜色
) )
;————————————————————绘制滑盘
(defun hp(ys)
(setq an0 (* pi (- 2 n1)))
(setq bl (*(getvar'viewsize)bs))
(repeat n ;                                                        颜色
(grdra_w p0 (*(getvar'viewsize)(* bs b0)) an0 55);滑盘内圈最小滑动触发距离
(grdra_w p0 bl an0 ys);滑盘外圈与分区
(setq an0 (+ an0 (/ pi (/ n 2)))) )
)

(hp oc);鼠标移动前绘制滑盘
;————————————————————
(princ ts)
;————————————————————光标所在环
(defun smx(p_i / s m x s_ m_ x_ zl gg gc gcs gcm gcx)
(defun s() (grdra_w p0 (* bl s_) (* pi p_i) gcs) (grdra_w p0 (* bl (+ s_ zl)) (* pi p_i) gcs) )
(defun m() (grdra_w p0 (* bl m_) (* pi p_i) gcm) (grdra_w p0 (* bl (+ m_ zl)) (* pi p_i) gcm) )
(defun x() (grdra_w p0 (* bl x_) (* pi p_i) gcx) (grdra_w p0 (* bl (+ x_ zl)) (* pi p_i) gcx) )

(setq
s_ 0.45 ;小环
m_ 0.73 ;中环
x_ 0.99 ;大环
zl 0.005 ;环增量
;——————————光标所在区各环颜色
gg 6 ;激活环颜色
gc 249 ;非激活环颜色
gcs gc ;小环颜色
gcm gc ;中环颜色
gcx gc ;大环颜色
)
;——————————
(grdra_w p0 bl (* pi p_i) gc);绘制区域环
(cond
((> pj (*(* bl b1) m_)) (setq hd (strcat hd "大") gcx gg gcm gcx gcs gcx gc gcx) (s) (m) (x))
((> pj (*(* bl b1) s_)) (setq hd (strcat hd "中") gcm gg gcs gcm) (s) (m) )
((< pj (*(* bl b1) m_)) (setq hd (strcat hd "小") gcs gg) (s) )
)
(princ (strcat "\n" ts1 "\n " hd))
)
;————————————————————光标所在环
(setq loop t i 3)
(while loop
(if ss (sssetfirst()ss));如果已选中对象则亮显它
(setq gr (grread t 8) ja (car gr) jp (cadr gr))
(cond
((= ja 3) (setq loop nil) (setq aj "左键") )
((= ja 25) (setq loop nil) (setq aj "右键") )
((= ja 5);移动鼠标

(redraw);更新
(setq bl (*(getvar'viewsize)bs));滑盘大小(屏幕高度×倍数)
(setq pj (distance p0 jp))
(if (< pj (* bl b0));小于滑动触发距离
(progn
(setq aj nil hd nil)
(princ"\n")
(hp oc);绘制滑盘
)
(progn ;————————————————————大于滑动触发距离鼠标移动
(redraw);更新
(hp xc);绘制滑盘
(grdraw p0 jp 1);光标引线
(setq ts1 (strcat "\n" ts "  " (itoa n) ) ) ;提示
(setq an (angle p0 jp))
;————————————————————画光标处小中大圆环(smx)
(if (> i (* n 2)) (setq i 3))
;      小环             中环            大环
(defun s()()) (defun m()()) (defun x()())
(cond ;————————————————————滑动判断
((< (* pi n1) an (* pi (* n1 3) ) ) (setq hd (itoa 1)) (smx n1) )
((< (* pi (* n1 i) ) an (* pi (* n1 (+ 2 i)) ) ) (setq hd (itoa (/(+ 1 i)2))) (smx (* n1 i)) )
((or(<=(* pi (* n1 (- (* n 2)1))) an (* pi 2)) (<= 0 an(* pi n1) ) ) (setq hd (itoa n)) (smx (* n1 (- (* n 2)1))) )
(loop (setq i (+ 2 i)))
);————————————————————滑动判断
;)
(if (> pj (* bl b1)) (setq loop nil aj (vl-string-subst "" "大" hd) hd nil) );光标离开滑盘
) ) );————————————————————移动鼠标结束
((= ja 2);————————————————————按键盘(grread)
(setq loop nil)
(cond
((= jp 96) (setq aj "`"))
((or(= jp 113)(= jp 81)) (setq aj "q"))
((or(= jp 119)(= jp 87)) (setq aj "w"))
((or(= jp 101)(= jp 69)) (setq aj "e"))
((or(= jp 114)(= jp 82)) (setq aj "r"))
((or(= jp 116)(= jp 84)) (setq aj "t"))
((or(= jp 121)(= jp 89)) (setq aj "y"))
((or(= jp 117)(= jp 85)) (setq aj "u"))
((or(= jp 105)(= jp 73)) (setq aj "i"))
((or(= jp 111)(= jp 79)) (setq aj "o"))
((or(= jp 112)(= jp 80)) (setq aj "p"))
((= jp 91) (setq aj "["))
((= jp 93) (setq aj "]"))
((= jp 8) (setq aj "删除")) ;Backspace
((= jp 61) (setq aj "="))
((or(= jp 97)(= jp 65)) (setq aj "a"))
((or(= jp 115)(= jp 83)) (setq aj "s"))
((or(= jp 100)(= jp 68)) (setq aj "d"))
((or(= jp 102)(= jp 70)) (setq aj "f"))
((or(= jp 103)(= jp 71)) (setq aj "g"))
((or(= jp 104)(= jp 72)) (setq aj "h"))
((or(= jp 106)(= jp 74)) (setq aj "j"))
((or(= jp 107)(= jp 75)) (setq aj "k"))
((or(= jp 108)(= jp 76)) (setq aj "l"))
((= jp 59) (setq aj ";"))
((= jp 39) (setq aj "'"))
((or(= jp 122)(= jp 90)) (setq aj "z"))
((or(= jp 120)(= jp 88)) (setq aj "x"))
((or(= jp 99)(= jp 67)) (setq aj "c"))
((or(= jp 118)(= jp 86)) (setq aj "v"))
((or(= jp 98)(= jp 66)) (setq aj "b"))
((or(= jp 110)(= jp 78)) (setq aj "n"))
((or(= jp 109)(= jp 77)) (setq aj "m"))
((= jp 44) (setq aj ","))
((= jp 92) (setq aj "\\"))
((= jp 13) (setq aj "回车"))
((= jp 32) (setq aj "空格"))
((= jp 46) (setq aj "."))
((= jp 48) (setq aj "0"))
((= jp 49) (setq aj "1"))
((= jp 50) (setq aj "2"))
((= jp 51) (setq aj "3"))
((= jp 52) (setq aj "4"))
((= jp 53) (setq aj "5"))
((= jp 54) (setq aj "6"))
((= jp 55) (setq aj "7"))
((= jp 56) (setq aj "8"))
((= jp 57) (setq aj "9"))
((= jp 43) (setq aj "+"))
((= jp 45) (setq aj "-"))
((= jp 42) (setq aj "*"))
((= jp 47) (setq aj "/"))
((= jp 9) (setq aj "tab"))
;————————————————————Shift+
((= jp 123) (setq aj "{"))
((= jp 125) (setq aj "}"))
((= jp 58) (setq aj ":"))
((= jp 34) (setq aj "\""))
((= jp 60) (setq aj "<"))
((= jp 62) (setq aj ">"))
((= jp 63) (setq aj "?"))
((= jp 124) (setq aj "|"))
((= jp 126) (setq aj "~"))
((= jp 33) (setq aj "!"))
((= jp 64) (setq aj "@"))
((= jp 35) (setq aj "#"))
((= jp 36) (setq aj "$"))
((= jp 37) (setq aj "%"))
((= jp 94) (setq aj "^"))
((= jp 38) (setq aj "&"))
((= jp 40) (setq aj "("))
((= jp 41) (setq aj ")"))
((= jp 95) (setq aj "_"))
) );————————————————————按键盘(grread)
) );while
(setvar'cursorsize gb);恢复光标大小
(setvar'pickbox bk);恢复靶框大小
(redraw);更新
(if hd (setq aj (strcat hd aj)))
(princ"\n")
aj
)

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-12-6 13:02 | 显示全部楼层
循环画环不对
(setq nx 5 i (/ 1.0 nx) )
(defun smx(p_i / i zl gg)
(setq
zl 0.005 ;环增量
gg 6 ;激活环颜色
)

(grdra_w p0 bl (* pi p_i) gc);绘制区域环

(if (> i nx) (setq i (/ 1.0 nx)) )
(if (> pj (* bl i)) (setq gg 6) (setq gg 160) )
(grdra_w p0 (* bl i) (* pi p_i) gg) (grdra_w p0 (* bl (+ i zl)) (* pi p_i) gg)
(setq i (+ i i))

(princ (strcat "\n" ts1 "\n " hd))
)
 楼主| 发表于 2023-12-6 13:18 | 显示全部楼层
圆环相邻距离由内到外递减

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-12-6 22:06 | 显示全部楼层
顶起来,大神们帮忙改一下啦
 楼主| 发表于 2023-12-7 16:50 | 显示全部楼层

大神,方便在帮看看吗?当分区数越大,鼠标顺时针移动时,光标要过了半个区,才会激活该区,逆时针时没问题
发表于 2023-12-7 19:22 | 显示全部楼层
努.力 发表于 2023-12-7 16:50
大神,方便在帮看看吗?当分区数越大,鼠标顺时针移动时,光标要过了半个区,才会激活该区,逆时针时没问 ...

啥问题啊 我测试挺好的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 08:07 , Processed in 0.218949 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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