关于画矩形的lsp,求大大优化一下呢
本帖最后由 酷酷提 于 2022-4-27 03:20 编辑源码来自于:Gu_xl 大大
遇到的问题是:这个源码是 以拾取点的中心为基点画矩形
希望得到解决方案是:以拾取基点为基础,鼠标向右上方移动,就以基点为基础 向右上方画矩形,鼠标往左上方移动,就以基点为基础向左上方画矩形,就是有可能鼠标会往左上左下,右上右下方向移动
(defun c:tt (/ w p1 p2 ang )
(initget 7)
(setq w (getdist "\n**输入宽度:"))
(princ "\n**输入")
(while (and
(setq p1 (getpoint "第一点:"))
(setq p2(getpoint p1 "\n**第二点:"))
)
(setq ang (angle p1 p2) l (distance p1 p2))
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 (trans (setq p(polar p1 (+ ang (* 0.5 pi)) (* 0.5 w))) 1 0))
(cons 10 (trans (setq p (polar p ang l)) 1 0))
(cons 10 (trans (setq p (polar p (- ang (* 0.5 pi)) w)) 1 0))
(cons 10 (trans (setq p (polar p (+ pi ang) l)) 1 0))
)
)
(princ "\n**继续输入")
)
(princ)
)
是这么玩的吗
(defun c:NM (/ h p1 p2 pa2 pa3 pa4 w xp1 xp2 yp1 yp2)
(setq h(getdist "\n**输入长度:"))
(setq w(getdist "\n**输入宽度:"))
(if(andh w)
(progn
(while
(setq p1 (getpoint "\n第一点:"))
(setq p2 (getpoint "\n第二点:" p1))
(setq xp1(car p1)
yp1(cadrp1)
xp2(car p2)
yp2(cadrp2))
(cond
((and(< xp1 xp2 )(< yp1 yp2)) ;---------------------------------------------------------01
(setq pa2(polar p1 0 w)
pa3(polar pa2 (* 0.5 pi) h)
pa4(polar pa3 PI w)
)
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 p1)(cons 10 pa2)(cons 10 pa3)(cons 10 pa4)
)
)
)
((and(> xp1 xp2 )(< yp1 yp2)) ;右下--》左上 ;---------------------------------------------------------02
(setq pa2(polar p1 PIw)
pa3(polar pa2 (* 0.5 pi) h)
pa4(polar pa3 0 w)
)
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 p1)(cons 10 pa2)(cons 10 pa3)(cons 10 pa4)
)
)
)
((and(< xp1 xp2 )(> yp1 yp2)) ;左上--》右下;---------------------------------------------------------03
(setq pa2(polar p1 0 w)
pa3(polar pa2 (* 1.5 pi) h)
pa4(polar pa3 PI w)
)
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 p1)(cons 10 pa2)(cons 10 pa3)(cons 10 pa4)
)
)
)
((and(> xp1 xp2 )(> yp1 yp2)) ;右上--》左下;---------------------------------------------------------04
(setq pa2(polar p1 PI w)
pa3(polar pa2 (* 1.5 pi) h)
pa4(polar pa3 0 w)
)
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 p1)(cons 10 pa2)(cons 10 pa3)(cons 10 pa4)
)
)
)
)
)
)
)
(princ)
)
可能要用grread,以判断方向 ;试试这个画水平或垂直矩形
(defun c:tt (/ w p1 p2 ang )
(initget 7)
(setq pi0.5 (* 0.5 pi))
(setq pi1.5 (* 1.5 pi))
(setq w (getdist "\n**输入宽度:"))
(setq h (getdist "\n**输入高度:"))
(princ "\n**输入")
(while (and
(setq p1 (getpoint "基点:"))
(setq pp(getpoint p1 " 方向指示点:"))
)
(setq ang (angle p1 pp))
(cond ( (and (< 0.0 ang) (< ang pi0.5))
(setq ang1 0.0)
(setq dang pi0.5)
)
( (= ang pi0.5)
(setq ang1 pi0.5)
(setq dang pi0.5)
)
( (and (< pi0.5 ang) (<= ang pi))
(setq ang1 pi)
(setq dang (- pi0.5))
)
( (and(< pi ang) (< ang pi1.5))
(setq ang1 pi)
(setq dang pi0.5)
)
( (= ang pi1.5)
(setq ang1 pi1.5)
(setq dang pi0.5)
)
(t
(setq ang1 0)
(setq dang (- pi0.5))
)
)
(setq p2 (polar p1 ang1 w))
(setq p3 (polar p2 (+ ang1 dang) h))
(setq p4 (polar p1 (+ ang1 dang) h))
(entmake
(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4)
'(70 . 1)
'(43 . 0.0)
'(38 . 0.0)
'(39 . 0.0)
(cons 10 p1)
(cons 10 p2)
(cons 10 p3)
(cons 10 p4)
)
)
(princ "\n**继续输入")
)
(princ)
) 效果大体是这样的
xj6019 发表于 2022-4-27 11:41
效果大体是这样的
老师,请问一下这个输入了长宽后,点击画面,没有出现矩形是什么情况呢
yshf 发表于 2022-4-27 10:38
;试试这个画水平或垂直矩形
(defun c:tt (/ w p1 p2 ang )
(initget 7)
老师,请问一下,这个矩形不往鼠标移动方向画矩形,是还需要怎么弄吗?
比如我鼠标往左下角移动点击,这个矩形还是往右边画了一个18的矩形
关掉正交就行 xj6019 发表于 2022-4-27 03:02
是这么玩的吗
(defun c:NM (/ h p1 p2 pa2 pa3 pa4 w xp1 xp2 yp1 yp2)
(setq h(getdist "\n**输入 ...
感谢老师,现在这个代码是先输入竖向的数字,再输入横向的数字,如果我想先输入横向数字,再输入竖向数字,是调整哪几个数值呢? 本帖最后由 xj6019 于 2022-4-28 16:13 编辑
酷酷提 发表于 2022-4-27 14:06
老师,请问一下,这个矩形不往鼠标移动方向画矩形,是还需要怎么弄吗?
比如我鼠标往左下角移动点击, ...
试试这样的,彻底改了一下,输入的时候要保证长度大于宽度,然后画的时候会根据鼠标点的第二点的位置画矩形,规则就是360度分了8份,看你鼠标点在哪个区域里,然后根据这个来定画出来的矩形的方向,萌新捣鼓这个有点费脑,咱也收俩币玩玩,嘿嘿
2.0
已经更新,请再试试,现在可以每次指定长度了,宽度在开始指定,每画完一个重新指定长度后再画第二个,然后依次类推,每次都需要先指定长度后,再画矩形,看看这样符合你的要求了吧!
3.0
按你的要求已经改成先指定点再输入长度了
4.0
改为了动态绘制,指定点指定长度后,可鼠标滑动预览实际效果,转到合适方向后,左键确认,也可以直接鼠标指定完点后,再鼠标指定长度,预览效果调整好方向后,左键绘制,循环操作。