明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1444|回复: 14

[提问] 关于CAD方向轮的思路

[复制链接]
发表于 2019-12-17 15:21 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2019-12-17 20:03 编辑

        我们在CAD操作方向,比如,移动,复制,拉伸等,都需要定个方向,从而操作结果满足要求,

       我考虑,能不能设计个《方向轮函数》,圆形的,里面带
grdraw箭头,用 grread 函数,鼠标移动象限动态箭头指示定方向,然后转到代码进行下面操作。。。

仅是个想法,这样很方便,减少击键,快速画图。。。

代码写的话,我实在是个大工程,本坛高手如云,这个不难吧?



说明:  
一: (setq p1 (nth 1 (grread 5))) 这个是初始取得
二:P2也用 grread 函数取得,四周移动       当P2位置落在图示的,1,2,3,4 范围时,取得 右,上,左,下的方向,并存与ang角度变量里。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-12-20 00:26 | 显示全部楼层
很牛X的样子
大神为了少按一个键也够拼了
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2019-12-19 18:10 | 显示全部楼层
lisperado 发表于 2019-12-19 18:01
箭头?leader不就行了吗?
可否上载图片示范为何画箭头要写代码?

;;;;;;;三领-定距拉伸;;;;;;框选样式代码;;;;;;;;;;;;;;;;;;;;;;;;
;;:1:可以定点定距离
;;:2:可以任意拉伸  
;;:3:可以输入距离拉伸
;;;4:和原CAD一样,具有拖曳效果
(defun c:tt (/ pt1 pt2 ang ss oldorh oldosm)
        (sl-cishu)
        (setq pt1 (getpoint "\n第一框角点: ")
                pt2 (getcorner pt1 "\n第二框角点: ")
        )
        (prompt "\n 移动鼠标定-->拉伸方向:")
        (command "select" "c" pt1 pt2 "")
        (setq ss (ssget "p"))
        (setq pt1 (yy:mid pt1 pt2))
        (setq ang (4dire1 pt1))
        (sldis)
        (setq sldis1 (/ sl-dis (getvar "dimlfac")))
        (setq pt2 (polar pt1 ang sldis1))
        (command "_.stretch" ss "" pt1 pt2)
        (princ)
)
;;说明:;;方向轮函数=【开始】==========================(一级)==============================
;;说明:;pt1 方向轮几点    返回 ang  取得角度
(defun 4dire1 (pt1 / gr grr p1 os loop lastss)
        ;;;;;;;;生成方位图--------------------------------
        (defun entmake-fx (pt1 pt / ss1)
                (if lastss (SL:PickSet-Erase lastss))
                (slslx pt1 0)
                (setq ss1 (entlast)) ;;;;;;构造最后一个实体选择集
                (entmakeX            ;;;;;;;;;;;;;;;;;;;;;创建 LEADER 对象
                        (list '(0 . "LEADER")
                                '(100 . "AcDbEntity")
                                '(100 . "AcDbLeader")
                                '(40 . 0.9875)
                                (cons 62 1)
                                (cons 10 pt)
                                (cons 10 pt1)
                                (list -3
                                        (list "ACAD"
                                                '(1000 . "DSTYLE")
                                                '(1002 . "{")
                                                '(1070 . 41)
                                                (cons 1040 (* 5.0 SLBL));;;;;箭头大小
                                                '(1002 . "}")
                                        )
                                )
                        )
                )
                (entmake (list '(0 . "CIRCLE") (cons 62 6) (cons 6 "xx")(cons 10 pt1) (cons 40 (* SLBL 10.0))))
                (setq lastss (last_ent ss1))
        )
        (setq os (getvar "osmode"))
        (setvar "osmode" 0)
        (setq loop t)
  (while loop
                (setq grr (grread t));请求输入
                (setq gr (car grr))
                (setq p1 (cadr grr))
                (cond
                        ((= gr 5);移动时
                                (setq ang (angle pt1 p1))
                                (if (and (>= ang 0.0)(< ang (* 0.25 pi)))  ;;;向右
                                        (progn
                                                (setq pt (polar pt1 0 (* 15.0 slbl)))
                                                (setq ang 0.0)
                                        )
                                )
                                (if (>= ang 5.5) ;;;向右
                                        (progn
                                                (setq pt (polar pt1 0 (* 15.0 slbl)))
                                                (setq ang 0.0)
                                        )
                                )
                                (if (and (>= ang (* 0.25 pi))(< ang (* 0.75 pi))) ;;;;;向上
                                        (progn
                                                (setq pt (polar pt1 (* 0.5 pi) (* 15.0 slbl)))
                                                (setq ang (* 0.5 pi))
                                        )
                                )
                                (if (and (>= ang (* 0.75 pi))(< ang (* 1.25 pi))) ;;;;;向左
                                        (progn
                                                (setq pt (polar pt1 pi (* 15.0 slbl)))
                                                (setq ang pi)
                                        )
                                )
                                (if (and (>= ang (* 1.25 pi))(< ang (* 2.0 pi))) ;;;;;向下
                                        (progn
                                                (setq pt (polar pt1 (* 1.5 pi) (* 15.0 slbl)))
                                                (setq ang (* 1.5 pi))
                                        )
                                )
                                (entmake-fx pt1 pt)
                        )               
                        ((or(equal grr '(2 32));空格
                                 (equal gr 3);左键
                                 (equal grr '(2 13));回车
                                 (equal grr'(11 0));右击
                         )
                                (setq loop nil)
                        )          
                )
        )
        (if lastss (SL:PickSet-Erase lastss))
        (redraw)
        (setvar "osmode" os)
        ang
)
;;说明:;;方向轮函数===================【结束】=====================================
 楼主| 发表于 2019-12-17 19:48 | 显示全部楼层
Kye 发表于 2019-12-17 19:32
跟黄老师这个类似?http://bbs.mjtd.com/thread-109147-1-1.html

黄大师是根据鼠标位置,执行不同的操作,我意思,这个函数,就鼠标移动取得:上、下、左、右 四个方向,不执行任何操作,方向可以用ang记录下来。。
发表于 2019-12-17 19:32 | 显示全部楼层
跟黄老师这个类似?http://bbs.mjtd.com/thread-109147-1-1.html

点评

我补充了个图示,你看看  发表于 2019-12-17 20:06
发表于 2019-12-17 20:30 | 显示全部楼层

谢谢版主,辛苦
发表于 2019-12-17 21:09 | 显示全部楼层
感觉似乎可能要用到方位角,http://bbs.mjtd.com/forum.php?mo ... =%B7%BD%CE%BB%BD%C7
发表于 2019-12-18 09:36 | 显示全部楼层
实际工作中大家都会有捕捉,点击确定后可能捕捉到其它的点。如果程序开始时记录原来捕捉,然后取消捕捉操作,结束后再恢复捕捉,那么如果程序没有正常结束,就不能恢复原有捕捉了。如果实现的话,估计有不少未预计的问题。
 楼主| 发表于 2019-12-18 18:21 | 显示全部楼层
mikewolf2k 发表于 2019-12-18 09:36
实际工作中大家都会有捕捉,点击确定后可能捕捉到其它的点。如果程序开始时记录原来捕捉,然后取消捕捉操作 ...

这个问题,如果大家再不写,我等不了,只能自己写出来!
发表于 2019-12-18 19:49 | 显示全部楼层
本帖最后由 lisperado 于 2019-12-18 20:09 编辑

判断夹角方向 来自晓东
determine quadrant 来自theswamp
强烈约束 来自cadtutor演示





 楼主| 发表于 2019-12-19 09:46 | 显示全部楼层
lisperado 发表于 2019-12-18 19:49
判断夹角方向 来自晓东
determine quadrant 来自theswamp
强烈约束 来自cadtutor演示

代码我看了,挺好的,无奈我改不了源码,我不要写数字,我要画箭头,我写好了一个,也实现了。
发表于 2019-12-19 18:01 | 显示全部楼层
尘缘一生 发表于 2019-12-19 09:46
代码我看了,挺好的,无奈我改不了源码,我不要写数字,我要画箭头,我写好了一个,也实现了。

箭头?leader不就行了吗?
可否上载图片示范为何画箭头要写代码?

p/s:猜测可能是block箭头块?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 13:06 , Processed in 0.220072 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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