乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 91|回复: 8

[编程交流] 拉伸矩形(或编辑

[复制链接]

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 20:10:02 | 显示全部楼层 |阅读模式
这似乎是一个简单的程序,但我在网上找不到任何对我有帮助的东西。
 
我想选择一个矩形,从中点将其宽度从10更改为40。长度将保持不变。我希望这是一个点击的东西。
 
最好的方法是让我的LISP同时选择两条边,每条边拉伸15mm?或者我应该更改4个顶点的Y坐标吗?
 
不管怎样,您将如何保存角点位置的变量?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 20:22:40 | 显示全部楼层
您可以选择一条矩形样条线,将拾取点与cnr点进行比较,然后提供一个+-值,并修改两个角点以适合此情况,这将是一个1拾取解决方案。无代码。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 20:27:25 | 显示全部楼层
在以下链接中查找所有附件。。。
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/select-rectangles-to-change-their-lenths-and-widths-at-once/td-p/5478058/page/2
 
HTH,M.R。
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 20:37:48 | 显示全部楼层
不幸的是,我在工作中使用AutoCAD 2002,我认为我没有您指定的选项,比格尔。
 
因此,该链接中的reccedit文件似乎可以满足我的需要,但程序经常崩溃。当我在第一个提示下选择时,我得到一个错误,即没有函数定义。当我选择Single时,我会收到另一个提示,提示我选择编辑。所有3个选项都给了我相同的错误,即没有函数定义,程序结束。所以我不能真正微调这个程序,因为我是一个初学者,不理解大部分代码,也看不到最终的结果来尝试自己破译代码。
 
我想要创建的程序也不需要所有这些提示。我只想选择矩形并告诉它“顶点1(Y)=顶点1(Y)+15”,“顶点2(Y)=顶点2(Y)+15”,等等。
 
将宽度从10更改为40的任务每个项目至少要完成1000次,因此这是我必须解决的项目类型。
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 20:44:14 | 显示全部楼层
所以我找到了一个非常接近我需要的程序。我只需要做一个修改,就可以让它实现我想要的。。。。。。。。现在程序将所有“Y”顶点增加15。如何使程序在负方向15上移动顶点1和2,在正方向15上移动顶点3和4?
 
 
  1. (defun Test (e ed / i vt)
  2. (setq i 0)
  3. (repeat (length ed)
  4. (if (= (car (nth i ed)) 10) ;if item is a vertex
  5. (progn
  6. (setq vt (cdr (nth i ed))) ; get vertex values
  7. (setq X (car vt)) ; get the x value
  8. (setq Y (cadr vt)) ; get the y value
  9. (setq Y (+ 15 Y)) ; increment the Y value by 15 units
  10. ; replace the old y value with the new y value
  11. (setq vt (subst Y (nth 1 vt) vt))
  12. ; update the entity definition with new vertex information
  13. (setq ed (subst (cons 10 vt) (nth i ed) ed))
  14. (entmod ed) ; update the drawing
  15. ) ;progn
  16. ) ;if
  17. (setq i (1+ i))
  18. ) ;repeat
  19. ) ;Test
  20. (defun C:MyTest (/ e ed)
  21. (setq e (car (entsel))
  22. ed (entget e)
  23. )
  24. (if (= (cdr (assoc 0 ed)) "LWPOLYLINE")
  25. (test e ed)
  26. ) ;if
  27. ) ;C:MyTest
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 20:50:59 | 显示全部楼层
这就存在了一个问题,即垂直度是第一位的,取决于矩形的绘制方式,即4条线,但不能保证左下角始终是第一位的。
 
我会使用这个(car(nth I ed))10),但如下所示,然后只添加或减去每个cnr,更新或删除rectang和redraw。
  1. (setq pt1 (car (nth 0 ed)) 10))
  2. (setq pt2  (car (nth 1 ed)) 10))
  3. (setq pt3 (car (nth 2 ed)) 10))
  4. (setq pt4 (car (nth 3 ed)) 10))
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 20:57:46 | 显示全部楼层
我的矩形每次都将以相同的方式绘制,因为它将来自之前制作的LISP。
 
因此,我想我可以将这些值绑定到我的“I”变量,但我的条件语句每次都输出“Nothing”。为什么程序没有认识到“i”的价值?
 
  1. (defun Test (e ed / i vt)
  2. (setq i 0)
  3. (repeat (length ed)
  4. (if (= (car (nth i ed)) 10) ;if item is a vertex
  5. (progn
  6. (setq vt (cdr (nth i ed))) ; get vertex values
  7. (setq X (car vt)) ; get the x value
  8. (setq Y (cadr vt)) ; get the y value
  9. (cond
  10. ((or (= i 0) (= i 1));or
  11.         (setq Y (+ 15 Y)) ; increse the Y value by 15 units
  12.         (setq vt (subst Y (nth 1 vt) vt)); replace the old y value with the new y value
  13.         (setq ed (subst (cons 10 vt) (nth i ed) ed)); update the entity definition with new vertex information
  14. );cond1
  15. ((or (= i 2) (= i 3));or
  16.         (setq Y (- 15 Y)) ; decrease the Y value by 15 units
  17.         (setq vt (subst Y (nth 1 vt) vt)); replace the old y value with the new y value
  18.         (setq ed (subst (cons 10 vt) (nth i ed) ed)); update the entity definition with new vertex information
  19. );cond2
  20. (t (princ "\nNothing"))
  21. );cond
  22. (entmod ed) ; update the drawing
  23. ) ;progn
  24. ) ;if
  25. (setq i (1+ i))
  26. ) ;repeat
  27. ) ;Test
  28. (defun C:MyTest (/ e ed)
  29. (setq e (car (entsel))
  30. ed (entget e)
  31. )
  32. (if (= (cdr (assoc 0 ed)) "LWPOLYLINE")
  33. (test e ed)
  34. ) ;if
  35. ) ;C:MyTest
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 21:09:16 | 显示全部楼层
好的,我终于想出了办法。我必须添加一个额外的计数器,只有当“I”值通过顶点测试时,它才会添加到“j”。我已经在下面发布了解决方案。
 
现在我到达了另一个停止点。这个Lisp程序是我的过程的“第2部分”,现在看来我必须返回并修改“第1部分”。垂直绘制的任何矩形(宽度:10/高度:100)的顶点方向与水平绘制的任何矩形(宽度:100/高度:10)的顶点方向相反。我通常是Vectorworks的用户,这给了我一个讨厌AutoCAD的理由!!我知道这是在AutoCAD 2011中用pedit修复的,但我使用的版本太旧了,如果它是一只狗,它会因年老而死。
 
我应该这样做还是有更好的解决方案?
 
顶点2x=(顶点2“X”位置)
顶点2Y=(顶点2“Y”位置)
顶点4x=(顶点4“X”位置)
顶点4y=(顶点4“Y”位置)
 
顶点2x=(顶点4“X”位置)
顶点2Y=(顶点4“Y”位置)
顶点4x=(顶点2“X”位置)
顶点4y=(顶点2“Y”位置)
 
 
 
 
回复

使用道具 举报

BKT

1

主题

124

帖子

123

银币

初来乍到

Rank: 1

铜币
7
发表于 2022-7-5 21:16:18 | 显示全部楼层
你把这个给你用了吗?如果没有,不妨试试比格尔上面提到的方法,重新创建矩形。这里有一个方法。。。
 
  1. ;; Select the midpoints of the rectangle on the sides to be stretched.
  2. ;;
  3. (defun c:test (/ ed lay1 osm pt1 pt2)
  4. (setq pt1 (getpoint "\nSelect First Midpoint: "))
  5. (setq pt2 (getpoint "\nSelect Second Midpoint: "))
  6. (setq ed (entget (car (nentselp pt1))))
  7. (setq lay1 (cdr (assoc 8 ed)))
  8. (if
  9. (= (car pt1) (car pt2))
  10. (command "._rectangle" (list (- (car pt1) 20) (cadr pt1)) (list (+ (car pt2) 20) (cadr pt2)))
  11. (command "._rectangle" (list (car pt1) (- (cadr pt1) 20)) (list (car pt2) (+ (cadr pt2) 20)))
  12. )
  13. (command "._chprop" (entlast) "" "LA" lay1 "")
  14. (entdel (cdr (car ed)))
  15. (princ)
  16. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 09:23 , Processed in 0.645745 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表