明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5965|回复: 27

诚求画矩形的小程序!

  [复制链接]
发表于 2013-1-9 12:31:50 | 显示全部楼层 |阅读模式
各位,
        大家好。在下有礼啦。我现要画很多不同宽度和长度的矩形条,所以我想就是输入一个快捷键(如:FX),然后CAD提示我输入矩形条的宽度,在输入宽度后,我任意点选平面上的两点,就能画出一条矩形条,该矩形条的宽度等于我输入的宽度值,长度等于我点选的两点间的距离,但这个矩形条的宽的中心必须分别在我点选的两点上(也就是说,该矩形的宽度关于我点选的两点所成的直线对称)。
        这与平常画的条形不一样。第一,平常画的矩形所点选的两点为矩形的对角点,而我现要的是我点选平面上的两点为宽度(参数)的中心点;第二,平常画的矩形是一个水平放置的矩形,而我现要的是矩形条不一定是水平放置,而是矩形条非宽度的边可能是水平,也可能是垂直,也可能是斜的,该边的斜率等于我点选平面上的两点所成直线的斜率。
        请问用LISP程序怎样编这样的程序。恳请赐教。
发表于 2018-7-28 18:42:42 | 显示全部楼层
正是我需要的,学习下
发表于 2018-7-14 07:25:44 | 显示全部楼层
仰慕啊辛苦了
发表于 2018-8-5 21:41:54 | 显示全部楼层
很好 拜学了
发表于 2013-1-9 12:59:37 | 显示全部楼层
  1. ;;;;;;;;;;;;非正交矩形画法3种
  2. (defun c:juxing1(/ pt1 pt2 ent gr grn grp ent2 dist entobj pt4 pt5)
  3.   (princ"\n.........动态任意矩形(命令juxing1)........")
  4.   (vla-startUndoMark mydoc)
  5.   (if(setq pt1(getpoint"\n请输入矩形边第一点:"))
  6.     (if(setq pt2(getpoint pt1"\n请输入矩形边另一点:"))
  7.       (progn
  8.         (entmake (list '(0 . "LINE")(cons 10 pt1)(cons 11 pt2)))
  9.         (setq ent(entlast)flag t)
  10.         (princ"\n请拖动鼠标决定矩形大小,任意键确定...")
  11.         (while(and flag(setq gr(grread t 8) grn(car gr) grp(cadr gr)))
  12.           (cond((= grn 5)
  13.                 (if ent2 (vla-delete (vlax-ename->vla-object ent2)))
  14.                 (setq dist (distance (setq pt3(apply 'vlax-curve-getclosestpointto (list ent grp)))grp))
  15.                 (setq entobj(vla-copy (vlax-ename->vla-object ent)))
  16.                 (vla-move entobj (vlax-3d-point pt3)(vlax-3d-point grp))
  17.                 (setq pt4(vlax-curve-getstartpoint entobj)
  18.                       pt5(vlax-curve-getendpoint entobj)
  19.                       )
  20.                 (entmake (append(list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity")'(100 . "AcDbPolyline")'(90 . 5))
  21.                                (mapcar '(lambda(x)(cons 10 x))(list pt1 pt2 pt5 pt4 pt1)))
  22.                          )
  23.                 (setq ent2(entlast))
  24.                 (vla-delete entobj)
  25.                 )
  26.                (t
  27.                 (setq flag nil)
  28.                 (vla-delete (vlax-ename->vla-object ent))
  29.                 )
  30.                )
  31.           )
  32.         )
  33.       )
  34.     )
  35.   (vla-endUndoMark mydoc)
  36.   (princ)
  37.   )

  38. (defun c:juxing2(/ pt1 pt2 ent gr grn grp ent2 dist entobj pt4 pt5)
  39.   (princ"\n.........三点任意矩形(命令juxing2)........")
  40.   (vla-startUndoMark mydoc)
  41.   (if(setq pt1(getpoint"\n请输入矩形边第一点:"))
  42.     (if(setq pt2(getpoint pt1"\n请输入矩形边另一点:"))
  43.       (progn
  44.         (entmake (list '(0 . "LINE")(cons 10 pt1)(cons 11 pt2)))
  45.         (setq ent(entlast))
  46.         (if (setq pt3(getpoint pt2"\n请输入一点确定矩形方向:"))      
  47.         (progn
  48.         (setq dist (distance (setq pt6(apply 'vlax-curve-getclosestpointto (list ent pt3)))pt3))
  49.         (setq entobj(vla-copy (vlax-ename->vla-object ent)))
  50.         (vla-move entobj (vlax-3d-point pt6)(vlax-3d-point pt3))
  51.         (setq pt4(vlax-curve-getstartpoint entobj)
  52.               pt5(vlax-curve-getendpoint entobj)
  53.               )
  54.         (entmake (append(list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity")'(100 . "AcDbPolyline")'(90 . 5))
  55.                        (mapcar '(lambda(x)(cons 10 x))(list pt1 pt2 pt5 pt4 pt1)))
  56.                  )
  57.         (setq ent2(entlast))
  58.         (vla-delete entobj)
  59.         (vla-delete (vlax-ename->vla-object ent))
  60.         )
  61.        )
  62.       )
  63.     )
  64.    )
  65.   (vla-endUndoMark mydoc)
  66.   (princ)
  67. )
  68. (defun c:juxing3()
  69.   (princ"\n.........旋转矩形(命令juxing3)........")
  70.   (setvar 'cmdecho 0)
  71.   (setvar 'orthomode 0)
  72.   (if(setq pt1(getpoint"\n请输入矩形第一点:"))
  73.     (vl-cmdf "rectang" pt1 "r" pause )
  74.     )
  75.   (princ)
  76.   )

点评

严兄,mydoc未定义  发表于 2013-1-10 16:26
发表于 2013-1-9 13:07:50 | 显示全部楼层
  1. (defun c:tt (/ w p1 p2 ang )
  2.   (initget 7)
  3.   (setq w (getdist "\n**输入宽度:"))
  4.   
  5.   (princ "\n**输入")
  6.   (while (and
  7.            (setq p1 (getpoint "第一点:"))
  8.            (setq p2  (getpoint p1 "\n**第二点:"))
  9.            )
  10.     (setq ang (angle p1 p2) l (distance p1 p2))
  11.     (entmake
  12.       (list
  13.         '(0 . "LWPOLYLINE")
  14.         '(100 . "AcDbEntity")
  15.         '(100 . "AcDbPolyline")
  16.         '(90 . 4)
  17.         '(70 . 1)
  18.         '(43 . 0.0)
  19.         '(38 . 0.0)
  20.         '(39 . 0.0)
  21.         (cons 10 (trans (setq p(polar p1 (+ ang (* 0.5 pi)) (* 0.5 w))) 1 0))
  22.         (cons 10 (trans (setq p (polar p ang l)) 1 0))
  23.         (cons 10 (trans (setq p (polar p (- ang (* 0.5 pi)) w)) 1 0))
  24.         (cons 10 (trans (setq p (polar p (+ pi ang) l)) 1 0))
  25.         )
  26.       )
  27.     (princ "\n**继续输入")
  28.     )
  29.   (princ)
  30.   )

点评

好用!  发表于 2013-3-22 09:48
快捷!高效!准确!下了学习,感谢G版!  发表于 2013-1-13 01:02
发表于 2013-1-9 14:11:17 | 显示全部楼层
Gu_xl 发表于 2013-1-9 13:07

又快又准!
发表于 2013-1-9 14:40:58 | 显示全部楼层
两大高人出手,兄弟:你有福了!
发表于 2013-1-9 15:51:26 | 显示全部楼层
haoryh 发表于 2013-1-9 14:40
两大高人出手,兄弟:你有福了!

真有福气啊
发表于 2013-1-9 23:17:07 | 显示全部楼层
yjr111 发表于 2013-1-9 12:59

(vla-startUndoMark mydoc)
这个让前两个不能用
发表于 2013-1-10 12:10:33 | 显示全部楼层
gu版最好,绝对的支持
 楼主| 发表于 2013-1-10 12:22:52 | 显示全部楼层
非常感激yjr111 和Gu_xl 的顶力帮助,同时也感激顶帖的各位。小弟学习了.thanks.
发表于 2013-1-10 12:49:31 | 显示全部楼层
楼主有福
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:37 , Processed in 0.215588 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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