关于CAD方向轮的思路
本帖最后由 尘缘一生 于 2019-12-17 20:03 编辑我们在CAD操作方向,比如,移动,复制,拉伸等,都需要定个方向,从而操作结果满足要求,
我考虑,能不能设计个《方向轮函数》,圆形的,里面带
grdraw箭头,用 grread 函数,鼠标移动象限动态箭头指示定方向,然后转到代码进行下面操作。。。
仅是个想法,这样很方便,减少击键,快速画图。。。
代码写的话,我实在是个大工程,本坛高手如云,这个不难吧?
说明:
一: (setq p1 (nth 1 (grread 5))) 这个是初始取得
二:P2也用 grread 函数取得,四周移动 当P2位置落在图示的,1,2,3,4 范围时,取得 右,上,左,下的方向,并存与ang角度变量里。
很牛X的样子
大神为了少按一个键也够拼了 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
)
;;说明:;;方向轮函数===================【结束】=====================================
Kye 发表于 2019-12-17 19:32
跟黄老师这个类似?http://bbs.mjtd.com/thread-109147-1-1.html
黄大师是根据鼠标位置,执行不同的操作,我意思,这个函数,就鼠标移动取得:上、下、左、右 四个方向,不执行任何操作,方向可以用ang记录下来。。 跟黄老师这个类似?http://bbs.mjtd.com/thread-109147-1-1.html
谢谢版主,辛苦 感觉似乎可能要用到方位角,http://bbs.mjtd.com/forum.php?mod=viewthread&tid=176366&highlight=%B7%BD%CE%BB%BD%C7 实际工作中大家都会有捕捉,点击确定后可能捕捉到其它的点。如果程序开始时记录原来捕捉,然后取消捕捉操作,结束后再恢复捕捉,那么如果程序没有正常结束,就不能恢复原有捕捉了。如果实现的话,估计有不少未预计的问题。 mikewolf2k 发表于 2019-12-18 09:36
实际工作中大家都会有捕捉,点击确定后可能捕捉到其它的点。如果程序开始时记录原来捕捉,然后取消捕捉操作 ...
这个问题,如果大家再不写,我等不了,只能自己写出来! 本帖最后由 lisperado 于 2019-12-18 20:09 编辑
判断夹角方向 来自晓东
determine quadrant 来自theswamp
强烈约束 来自cadtutor演示
lisperado 发表于 2019-12-18 19:49
判断夹角方向 来自晓东
determine quadrant 来自theswamp
强烈约束 来自cadtutor演示
代码我看了,挺好的,无奈我改不了源码,我不要写数字,我要画箭头,我写好了一个,也实现了。 尘缘一生 发表于 2019-12-19 09:46
代码我看了,挺好的,无奈我改不了源码,我不要写数字,我要画箭头,我写好了一个,也实现了。
箭头?leader不就行了吗?
可否上载图片示范为何画箭头要写代码?
p/s:猜测可能是block箭头块?
页:
[1]
2