乐筑天下

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

[编程交流] 修复Lee Mac的CopyRel Lisp

[复制链接]

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:51:49 | 显示全部楼层 |阅读模式
大家好,
 
CAD导师新手。我来这里是想找一个lisp例程,从一个点到最后一个复制点的不同距离进行多个复制。
 
我在一个旧帖子上找到了李的Lisp程序程序,但我遇到了麻烦。我正在使用AutoCAD 2018。
 
  1. (defun c:copyrel ( / b i l o p q s )
  2.    (if
  3.        (and
  4.            (setq s (ssget "_:L"))
  5.            (setq p (getpoint "\nSpecify Base Point: "))
  6.            (setq b (vlax-3D-point (trans p 1 0)))
  7.        )
  8.        (progn
  9.            (repeat (setq i (sslength s))
  10.                (setq l (cons (vlax-ename->vla-object (ssname s (setq i (1- i)))) l))
  11.            )
  12.            (while (setq q (acet-ss-drag-move s p "\nSpecify Second Point: " 0 0))
  13.                (setq s (ssadd))
  14.                (foreach x l
  15.                    (vla-move (setq o (vla-copy x)) b (vlax-3D-point (trans q 1 0)))
  16.                    (ssadd (vlax-vla-object->ename o) s)
  17.                )
  18.                (setq p q)
  19.            )
  20.        )
  21.    )
  22.    (princ)
  23. )
  24. (vl-load-com)
  25. (princ)

 
所以它似乎一直持续到第二份。我的问题是我无法控制第二份的方向。此外,距离对于其复制到的方向也不正确。
 
我试图用它来快速绘制柱网。我打开了正交模式。我的第一个副本是水平的,第二个也是水平的,所有的视觉提示都显示为它将被水平复制,就像另一个副本一样。但是,其结果是向下复制对象。甚至没有达到正确的距离。例如,我输入了20'-8“,它在Y轴上复制了7''。
 
这正是我想要的,所以如果有人能帮我解决这个问题,那就太棒了!!
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:03:02 | 显示全部楼层
链接到OP:http://www.cadtutor.net/forum/showthread.php?71563-相对于上次复制位置的复制功能
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 16:09:00 | 显示全部楼层
看看这个是否有效。命令名为copyrel,而不是copyrel。
 
测试。lsp
 
顺便提一下不是我写的。。。李·麦克做到了。这是他在2012年8月6日发布到帖子上的两个非常相似的例程中的第一个。
 
我想你用了第二套。
 
在我的测试中,lisp例程起了作用。我正在运行AutoCAD 2018。
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:21:42 | 显示全部楼层
 
成功了!谢谢。
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 16:29:19 | 显示全部楼层
我很高兴听到你也这么做了。谢谢你更新我们。
 
对于其他感兴趣的人,可以在本线程的第8篇文章中找到例程的两个版本。我不知道为什么第二个在AutoCAD 2018中没有按预期工作。我也有问题,这就是为什么我在回答上述问题之前尝试了第一个版本。
 
http://www.cadtutor.net/forum/showthread.php?71563-相对于上次复制位置的复制功能
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:29:29 | 显示全部楼层
这是一个延伸,但我想我会问,是否有任何方式可以像默认的复制或移动命令一样打开被复制对象的预览?
 
我可能只是用这个命令替换copy命令,但有时对于不精确的复制,我只是直观地使用它,这是lisp目前不允许的,因为没有预览。
 
就像我说的,这完全是在黑暗中拍摄的,所以如果做不到,不用担心
 
再次感谢您的帮助!使布置柱网成为小菜一碟
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 16:39:17 | 显示全部楼层
你的要求超出了我的专业水平。不过,这里的一位Lisp程序大师应该能够回答你的问题。耐心
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:50:30 | 显示全部楼层
我能用grread做的最接近的事情是:
 
  1. (defun C:copyrel ( / SS b r )
  2. (and (setq SS (ssget "_:L")) (setq b (getpoint "\nSpecify Base Point: ")) (setq r (my-ss-drag-move b SS))
  3.    (while r (princ "\nSpecify next point <exit>: ")
  4.      (setq r (apply 'my-ss-drag-move r))
  5.    )
  6. )
  7. (princ)
  8. )
  9. (vl-load-com) (princ)
  10. (defun my-ss-drag-move ( b SS / _MoveSS _CopySS _MoveCopySS SS b i L nL g s p prev nSS tmp )
  11. '(87 114 105 116 116 101 110 32 98 121 32 71 114 114 114)
  12. (setq _MoveSS (lambda ( L p1 p2 ) (foreach x L (vla-Move x p1 p2))))
  13. (setq _CopySS (lambda ( L ) (foreach x L (setq nL (cons (vla-Copy x) nL))) nL))
  14. (and (or SS (setq SS (ssget "_:L"))) (or b (setq b (getpoint "\nSpecify Base Point: ")))
  15.    (setq b (trans b 1 0))
  16.    (repeat (setq i (sslength SS)) (setq L (cons (vlax-ename->vla-object (ssname SS (setq i (1- i)))) L)))
  17.    (setq nL (_CopySS L))
  18.    (while (not s) (setq g (grread T)) (redraw)
  19.      (cond
  20.        ( (equal g '(2 13)) (setq s T) )
  21.        ( (= (car g) 5) (if p (grdraw b p 1 3)) (setq p (trans (cadr g) 1 0)) (_MoveSS nL (cond (prev (vlax-3D-point prev))((vlax-3D-point b))) (vlax-3D-point p)) (setq prev p) )
  22.        ( (= (car g) 3) (if (setq tmp (getpoint "\nTo snap specify again <back>: ")) (progn (_MoveSS nL (vlax-3D-point prev) (vlax-3D-point tmp)) (setq s T)))  )
  23.        ( (= (car g) 25) (setq prev nil) (mapcar 'vla-Delete nL) (setq s T) )
  24.      ); cond               
  25.    ); while
  26. ); and
  27. (redraw)
  28. (if tmp (list tmp (progn (setq nSS (ssadd)) (mapcar (function (lambda (x) (ssadd (vlax-vla-object->ename x) nSS))) nL) nSS)))
  29. ); defun my-ss-drag-move

 
但正如您所见,由于捕捉问题,它需要额外的点输入(否则,没有该输入,您将无法在任何地方捕捉[预览捕捉])。
虽然我认为仍然可以通过使用这样的东西来复制acet ss拖动动作。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:54:15 | 显示全部楼层
如果您不关心acet-ss-drag-move及其效果,那么下面的代码将起作用。与本文讨论的Lee代码相比,它还具有复制关联关系(例如尺寸和填充图案)的优势。
  1. (vl-load-com)
  2. (defun c:CopyRelAlt ( / *error* doc end org ss sta)
  3. (defun *error* (msg)
  4.    (setvar 'cmdecho 1)
  5.    (vla-endundomark doc)
  6. )
  7. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  8. (vla-endundomark doc)
  9. (vla-startundomark doc)
  10. (if
  11.    (and
  12.      (setq ss (ssget))
  13.      (setq org (getpoint "\nBase point: "))
  14.    )
  15.    (progn
  16.      (setq sta org)
  17.      (setvar 'cmdecho 0)
  18.      (while (setq end (getpoint sta "\nSecond point or Enter: "))
  19.        (command "_.copy" ss "" "_non" org "_non" end)
  20.        (setq sta end)
  21.      )
  22.      (setvar 'cmdecho 1)
  23.    )
  24. )
  25. (vla-endundomark doc)
  26. (princ)
  27. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 20:58 , Processed in 0.453663 second(s), 70 queries .

© 2020-2025 乐筑天下

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