明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4190|回复: 13

[讨论] 求动态拖动矩形的一个角点或一条边的LISP代码

[复制链接]
发表于 2014-1-5 10:25:12 | 显示全部楼层 |阅读模式
5明经币
请问,有没有动态拖动矩形的一个角点或一条边的LISP代码?我不会动态。
我碰到的问题是,我画了一个矩形A,我要微调它的大小,一动,它就变成了非矩形。我希望我拖动它一条边或一个角点时,它永远为矩形,这样就美观。
我希望代码对与坐标轴斜交的矩形也有效。当然如果只是对与坐标轴平行的有效也可以。
这个很有用途的啊。矩形多好看,歪多边形多难看



最佳答案

发表于 2014-1-5 10:25:13 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-1-5 20:33 编辑

  1. (defun dragrect(/ e e2 a b c d f g p p1 p2 q pt oldMACRO Plinexy ptoline makepl isrect)
  2.   (defun Plinexy(e / p a b n ob q et d d1 en et) ;;多线段节点坐标(滤掉了多余点,未处理假闭合)
  3.     (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
  4.     (cond((="LWPOLYLINE"et)
  5.    (repeat(length a)(setq b (nth n a) n (+ n 1))
  6.      (if (= 10 (car b))(progn
  7.                                (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
  8.                                (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  9.                                  (setq p (list q))))
  10.        )))
  11.   ((="POLYLINE"et)
  12.    (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
  13.    (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
  14.      (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
  15.      (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
  16.        (setq p (list q)))
  17.      (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
  18.    (setq p(reverse p))))P)
  19.   (defun ptoline(p p1 p2 / l a b c d);;p在线外p1近端点p2远端点
  20.     (if(>(distance p p1)(distance p p2))(setq d p1 p1 p2 p2 d))
  21.     (setq a(distance p1 p2)
  22.    c(distance p p1)
  23.    b(distance p p2)
  24.    l(/(-(+(* a a)(* c c))(* b b))(* a 2))
  25.    d(polar p1(if(< l 0)(angle p2 p1)(angle p1 p2))(abs l))))
  26.   (defun makepl(pt)
  27.     (entmake(append(list'(0 . "LWPOLYLINE")'(100 . "AcDbEntity")'(100 . "AcDbPolyline")
  28.    '(8 . "0")'(90 . 4)'(70 . 1))(mapcar'(lambda(x)(cons 10 x))pt))))
  29.   (defun isrect(e / pt)
  30.     (if(and(=(length(setq pt(plinexy e)))4)
  31.     (null(vl-remove 0.0(mapcar'cdr(vl-remove-if-not'(lambda (x)(=(car x)42))(entget e)))))
  32.     (EQUAL(distance(car pt)(nth 2 pt))(distance(nth 1 pt)(nth 3 pt))1e-6))pt))
  33.   (setq oldMACRO(getvar"MODEMACRO"))
  34.   (initget"1 2 3")
  35.   (setq c(getkword"\n固定方式1.自动,2固定点取边,3固定对边<3>"))
  36.   (if(null c)(setq c"3"))
  37.   (initget"1 2")(setq d(getkword"调整方式1.自由拖动,2输入面积<1>"))(if(null d)(setq d"1"))
  38.   (while(setq b(entsel"\n选择矩形(右键退出)"))
  39.     (if(setq e2 nil a(car b)b(nth 1 b) pt(isrect a))
  40.       (progn
  41. (if(<"1"c)
  42.    (setq f(cdar(vl-sort(list(list(distance(ptoline b(car pt)(cadr pt))b)(car pt)(cadr pt))
  43.        (list(distance(ptoline b(cadr pt)(caddr pt))b)(cadr pt)(caddr pt))
  44.        (list(distance(ptoline b(caddr pt)(last pt))b)(caddr pt)(last pt))
  45.        (list(distance(ptoline b(car pt)(last pt))b)(car pt)(last pt)))
  46.          (function(lambda(x y)(<(car x)(car y))))))
  47.   g(vl-remove(last f)(vl-remove(car f)pt))
  48.   f(if(="3"c)(setq p g g f f p)f)))
  49. (setvar"MODEMACRO"(strcat"面积="(rtos(vla-get-area(vlax-ename->vla-object a))2 4)))
  50. (if(="1"d)
  51.    (progn
  52.      (while(/=(car(setq b(grread 5)))3)
  53.        (if e2(entdel(entlast)))
  54.        (if(="1"c)
  55.   (setq b(nth 1 b)
  56.         p(vl-sort pt(function(lambda(x y)(<(distance x b)(distance y b)))))
  57.         q(list(nth 1 p)(nth 2 p))p(last p)
  58.         p1(ptoline b p(car q))
  59.         p2(ptoline b p(cadr q)))
  60.   (setq b(nth 1 b)p1(car f)
  61.         ang(angle(ptoline b(last f)p1)b)
  62.         di(distance(ptoline b(last f)p1)b)
  63.         b(last f)
  64.         p(polar p1 ang di)
  65.         p2(polar b ang di)))
  66.        (setq e2(makepl(mapcar'(lambda(x)(list(car x)(cadr x)))(list b p1 p p2))))
  67.        (setvar"MODEMACRO"(strcat"面积="(rtos(*(distance b p1)(distance b p2))2 4))))
  68.      (if e2(entdel(entlast)))
  69.      (if(="1"c)
  70.        (setq b(nth 1 b)
  71.       p(vl-sort pt(function(lambda(x y)(<(distance x b)(distance y b)))))
  72.       q(list(nth 1 p)(nth 2 p))p(last p)
  73.       p1(ptoline b p(car q))
  74.       p2(ptoline b p(cadr q)))
  75.        (setq b(nth 1 b)p1(car f)
  76.       ang(angle(ptoline b(last f)p1)b)
  77.       di(distance(ptoline b(last f)p1)b)
  78.       b(last f)
  79.       p(polar p1 ang di)
  80.       p2(polar b ang di)))
  81.      (setvar"MODEMACRO"(strcat"面积="(rtos(*(distance b p1)(distance b p2))2 4))))
  82.    (progn
  83.      (setq e2(getreal"输入目标面积"))
  84.      (setq p1(car f)b(last f)
  85.     ang(if(equal(rem(abs(-(angle p1(car g))(angle p1 b)))pi)1.57079633 1e-6)(angle p1(car g))(angle p1(last g)))
  86.     di(/ e2(distance p1 b))
  87.     p(polar p1 ang di)
  88.     p2(polar b ang di))))
  89. (setq e(entget a)e2(member(assoc 90 e)e))
  90. (foreach x e2(setq e(vl-remove x e)))
  91. (setq e(append e'((90 . 4)(70 . 1)))
  92.        e(if(assoc 43 e2)(append e(list(assoc 43 e2))))
  93.        e(if(assoc 38 e2)(append e(list(assoc 38 e2))))
  94.        e(if(assoc 39 e2)(append e(list(assoc 39 e2))))
  95.        e2(member(assoc 10 e2)e2))
  96. (foreach x(mapcar'(lambda(x)(list(car x)(cadr x)))(list b p1 p p2))
  97.    (setq e(append e(list(cons 10 x)(cadr e2)(caddr e2)'(42 . 0)))e2(cddddr e2)))
  98. (entmod e))(alert"你选择的不是矩形")))
  99.   (setvar"MODEMACRO"oldMACRO)
  100.   (princ))


试试这个







本帖子中包含更多资源

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

x

点评

非常好``````````````````GG  发表于 2014-6-5 20:38
这个代码运行还可以。但还不满足要求,因为它每次都是拖动角点。我希望它能有一个选项,只拖动一条边A,它的对边C不动。相邻边只是延长或缩短,靠C边的两个端点要求不能动。有这样的选项才好。因为矩形非常大  发表于 2014-1-5 17:03

评分

参与人数 1明经币 +1 收起 理由
清风明月名字 + 1 赞一个!,选项非常多,用户有自由发挥的空间

查看全部评分

回复

使用道具 举报

发表于 2014-1-5 11:17:31 | 显示全部楼层
本帖最后由 陨落 于 2014-1-5 11:18 编辑

编程的话有个问题就是捕捉设置很麻烦,你可以看看这个http://bbs.mjtd.com/forum.php?mod=viewthread&tid=84963,可以解决你一部分问题
回复

使用道具 举报

 楼主| 发表于 2014-1-5 11:25:57 | 显示全部楼层
陨落 发表于 2014-1-5 11:17
编程的话有个问题就是捕捉设置很麻烦,你可以看看这个http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8 ...

谢谢,实在难。能帮我写一个吗?
回复

使用道具 举报

发表于 2014-1-5 15:28:09 | 显示全部楼层
用高版吧,我用2014就有这功能,直接就可以拖动.

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2014-1-5 15:37:35 | 显示全部楼层
专业软件限制,只能最高用CAD2005
回复

使用道具 举报

发表于 2014-1-5 16:06:40 | 显示全部楼层
  1. (defun C:tt (/ OS P1 P2 P LST)
  2.   (setq OS (getvar 'OSMODE))
  3.   (setvar 'OSMODE 0)
  4.   (vl-catch-all-apply
  5.     '(lambda ()
  6.        (while (and (setq P1 (getpoint "\n指定第一个角点: "))
  7.                    (setq P2 (getcorner P1 "\n指定对角点: "))
  8.               )
  9.          (and (ssget "_C" P1 P2)
  10.               (setq LST (cons (list P1 P2) LST))
  11.               (grvecs (list -160
  12.                             P1
  13.                             (setq P (cons (car P1) (cdr P2)))
  14.                             -160
  15.                             P2
  16.                             P
  17.                             -160
  18.                             P1
  19.                             (setq P (cons (car P2) (cdr P1)))
  20.                             -160
  21.                             P2
  22.                             P
  23.                       )
  24.               )
  25.          )
  26.        )
  27.        (and LST
  28.             (setvar 'OSMODE OS)
  29.             (setq P1 (getpoint "\n指定基点: "))
  30.             (setq P2 (getpoint P1 "\n指定第二个点: "))
  31.             (setvar 'OSMODE 0)
  32.             (foreach X LST
  33.               (apply 'command
  34.                      (append '("_.STRETCH" "_C") X (list "" P1 P2))
  35.               )
  36.             )
  37.        )
  38.      )
  39.   )
  40.   (redraw)
  41.   (setvar 'OSMODE OS)
  42.   (princ)
  43. )




回复

使用道具 举报

发表于 2014-1-5 16:10:30 | 显示全部楼层
应该是像这样吧

本帖子中包含更多资源

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

x

点评

不是,你的运行后,矩形会变为非矩形。我要的结果是仍为矩形  发表于 2014-1-5 16:28
回复

使用道具 举报

发表于 2014-1-5 16:32:04 | 显示全部楼层
看演示,你操作有误吧
回复

使用道具 举报

 楼主| 发表于 2014-1-5 16:33:55 | 显示全部楼层
本帖最后由 清风明月名字 于 2014-1-5 16:52 编辑

不行的,我也不知道什么原因。可能是你有意沿它的延伸方向拖动的,而我没有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 16:28 , Processed in 0.211759 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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