泉(Ango) 发表于 2013-1-9 12:31:50

诚求画矩形的小程序!

各位,
      大家好。在下有礼啦。我现要画很多不同宽度和长度的矩形条,所以我想就是输入一个快捷键(如:FX),然后CAD提示我输入矩形条的宽度,在输入宽度后,我任意点选平面上的两点,就能画出一条矩形条,该矩形条的宽度等于我输入的宽度值,长度等于我点选的两点间的距离,但这个矩形条的宽的中心必须分别在我点选的两点上(也就是说,该矩形的宽度关于我点选的两点所成的直线对称)。
      这与平常画的条形不一样。第一,平常画的矩形所点选的两点为矩形的对角点,而我现要的是我点选平面上的两点为宽度(参数)的中心点;第二,平常画的矩形是一个水平放置的矩形,而我现要的是矩形条不一定是水平放置,而是矩形条非宽度的边可能是水平,也可能是垂直,也可能是斜的,该边的斜率等于我点选平面上的两点所成直线的斜率。
      请问用LISP程序怎样编这样的程序。恳请赐教。

qjg_77 发表于 2018-7-28 18:42:42

正是我需要的,学习下

894560869 发表于 2018-7-14 07:25:44

仰慕啊辛苦了

Krio飞 发表于 2018-8-5 21:41:54

很好 拜学了

yjr111 发表于 2013-1-9 12:59:37

;;;;;;;;;;;;非正交矩形画法3种
(defun c:juxing1(/ pt1 pt2 ent gr grn grp ent2 dist entobj pt4 pt5)
(princ"\n.........动态任意矩形(命令juxing1)........")
(vla-startUndoMark mydoc)
(if(setq pt1(getpoint"\n请输入矩形边第一点:"))
    (if(setq pt2(getpoint pt1"\n请输入矩形边另一点:"))
      (progn
        (entmake (list '(0 . "LINE")(cons 10 pt1)(cons 11 pt2)))
        (setq ent(entlast)flag t)
        (princ"\n请拖动鼠标决定矩形大小,任意键确定...")
        (while(and flag(setq gr(grread t 8) grn(car gr) grp(cadr gr)))
          (cond((= grn 5)
                (if ent2 (vla-delete (vlax-ename->vla-object ent2)))
                (setq dist (distance (setq pt3(apply 'vlax-curve-getclosestpointto (list ent grp)))grp))
                (setq entobj(vla-copy (vlax-ename->vla-object ent)))
                (vla-move entobj (vlax-3d-point pt3)(vlax-3d-point grp))
                (setq pt4(vlax-curve-getstartpoint entobj)
                      pt5(vlax-curve-getendpoint entobj)
                      )
                (entmake (append(list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity")'(100 . "AcDbPolyline")'(90 . 5))
                             (mapcar '(lambda(x)(cons 10 x))(list pt1 pt2 pt5 pt4 pt1)))
                       )
                (setq ent2(entlast))
                (vla-delete entobj)
                )
             (t
                (setq flag nil)
                (vla-delete (vlax-ename->vla-object ent))
                )
             )
          )
        )
      )
    )
(vla-endUndoMark mydoc)
(princ)
)

(defun c:juxing2(/ pt1 pt2 ent gr grn grp ent2 dist entobj pt4 pt5)
(princ"\n.........三点任意矩形(命令juxing2)........")
(vla-startUndoMark mydoc)
(if(setq pt1(getpoint"\n请输入矩形边第一点:"))
    (if(setq pt2(getpoint pt1"\n请输入矩形边另一点:"))
      (progn
        (entmake (list '(0 . "LINE")(cons 10 pt1)(cons 11 pt2)))
        (setq ent(entlast))
      (if (setq pt3(getpoint pt2"\n请输入一点确定矩形方向:"))      
        (progn
        (setq dist (distance (setq pt6(apply 'vlax-curve-getclosestpointto (list ent pt3)))pt3))
        (setq entobj(vla-copy (vlax-ename->vla-object ent)))
        (vla-move entobj (vlax-3d-point pt6)(vlax-3d-point pt3))
        (setq pt4(vlax-curve-getstartpoint entobj)
              pt5(vlax-curve-getendpoint entobj)
              )
        (entmake (append(list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity")'(100 . "AcDbPolyline")'(90 . 5))
                     (mapcar '(lambda(x)(cons 10 x))(list pt1 pt2 pt5 pt4 pt1)))
               )
        (setq ent2(entlast))
        (vla-delete entobj)
        (vla-delete (vlax-ename->vla-object ent))
        )
       )
      )
    )
   )
(vla-endUndoMark mydoc)
(princ)
)
(defun c:juxing3()
(princ"\n.........旋转矩形(命令juxing3)........")
(setvar 'cmdecho 0)
(setvar 'orthomode 0)
(if(setq pt1(getpoint"\n请输入矩形第一点:"))
    (vl-cmdf "rectang" pt1 "r" pause )
    )
(princ)
)

Gu_xl 发表于 2013-1-9 13:07:50


(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)
)

yuanziyou 发表于 2013-1-9 14:11:17

Gu_xl 发表于 2013-1-9 13:07 static/image/common/back.gif


又快又准!

haoryh 发表于 2013-1-9 14:40:58

两大高人出手,兄弟:你有福了!

革天明 发表于 2013-1-9 15:51:26

haoryh 发表于 2013-1-9 14:40 static/image/common/back.gif
两大高人出手,兄弟:你有福了!

真有福气啊

xsso 发表于 2013-1-9 23:17:07

yjr111 发表于 2013-1-9 12:59 static/image/common/back.gif


(vla-startUndoMark mydoc)
这个让前两个不能用

848818376 发表于 2013-1-10 12:10:33

gu版最好,绝对的支持

泉(Ango) 发表于 2013-1-10 12:22:52

非常感激yjr111 和Gu_xl 的顶力帮助,同时也感激顶帖的各位。小弟学习了.thanks.

AbnerXk 发表于 2013-1-10 12:49:31

楼主有福
页: [1] 2 3
查看完整版本: 诚求画矩形的小程序!