乐筑天下

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

[编程交流] 移动多个块或obje

[复制链接]

27

主题

182

帖子

163

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2022-7-6 03:05:11 | 显示全部楼层 |阅读模式
伙计们,
 
有人知道如何使用线条作为参考移动多个块或对象,如下图所示(使用镜子在端点之间的中点或端点):
 
040515vworwirxowialixs.jpg
 
谢谢

                               
登录/注册后可看大图
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 03:09:20 | 显示全部楼层
使用块和命令“\u mirror”的快速方法
 
  1. (defun c:mbt (/ ss ln p1 1p 2p)
  2. (vl-load-com)(setvar 'osmode 0)
  3. (if (setq ss (ssget '((0 . "INSERT"))))
  4.    (repeat (setq i (sslength ss))
  5.      (vla-getboundingbox
  6. (vlax-ename->vla-object
  7.   (setq e (ssname ss (setq i (1- i))))
  8. )
  9. 'mn
  10. 'mx
  11.      )
  12.      (if (setq        ln (ssget "_C"
  13.                   (vlax-safearray->list mn)
  14.                   (vlax-safearray->list mx)
  15.                   '((0 . "LINE"))
  16.            )
  17.   )
  18. (command "_mirror"
  19.          e
  20.          ""
  21.          (setq p1 (mapcar (function (lambda (a b) (/ (+ a b) 2.)))
  22.                           (setq        1p
  23.                                  (cdr (assoc 10 (setq ent (entget (ssname ln 0)))))
  24.                           )
  25.                           (setq 2p (cdr (assoc 11 ent)))
  26.                   )
  27.          )
  28.          "_non"
  29.          (polar p1 (+ (/ pi 2.0) (angle 1p 2p)) 1.0)
  30.          "_Yes"
  31. )
  32.      )
  33.    )
  34. )
  35. (princ)
  36. )
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 03:13:50 | 显示全部楼层
这将镜像块,即使它不位于直线的端点。
 
  1. (defun C:test (/ bl l ss i el p p1 p2)
  2. (setq ss (ssget "_:l" '((0 . "INSERT,LINE"))))
  3. (repeat (setq i (sslength ss))
  4. (if (= "INSERT" (cdr (assoc 0 (entget (ssname ss (setq i (1- i)))))))
  5.      (setq bl (cons (ssname ss i) bl))
  6.      (setq l (cons (ssname ss i) l))
  7. )
  8. )
  9. (if
  10. (= (length bl) (length l))
  11. (foreach x bl
  12.    (setq el
  13.      (vl-sort
  14.        (append
  15.          (mapcar
  16.            (function
  17.              (lambda (a)
  18.                (cons a
  19.           (distance
  20.             (cdr (assoc 10 (entget x)))
  21.                    (cdr (assoc 10 (entget a)))
  22.                  )           
  23.                )
  24.              )
  25.            ) l
  26.          )
  27.          (mapcar
  28.     (function
  29.              (lambda (a)
  30.                (cons a
  31.                  (distance
  32.                    (cdr (assoc 10 (entget x)))
  33.                    (cdr (assoc 11 (entget a)))
  34.                  )
  35.                )  
  36.              )
  37.            ) l
  38.          )
  39.        )
  40.        (function
  41.       (lambda (e1 e2)  
  42.         (<  (cdr e1) (cdr e2))
  43.          )
  44.        )
  45.      )
  46.    )
  47. (setq p1 (cdr (assoc 10 (entget (caar el))))
  48.      p2 (cdr (assoc 11 (entget (caar el))))
  49.      p  (mapcar (function (lambda (a b) (/ (+ a b) 2.))) p1 p2))
  50. (command "_.mirror" x "" "_non" p "_non" (polar p (+ (angle p1 p2)(/ pi 2.)) 1)  "y")
  51. )
  52. (princ "\nSelected entities are not equal. Try again!")
  53. )
  54. (princ)
  55. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 03:16:43 | 显示全部楼层
我想过“不在一条线的端点”之类的东西,但在这种情况下。。
 
040517bv9iyyuzufv22l6k.png
 
所以我保留了我正在编写的代码,它与您的代码惊人地相似。我想在选择中包括的不仅仅是块
 
随便。让我们等待OP澄清它是否包含除单个块之外的对象
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 03:21:06 | 显示全部楼层
这里有一种替代方法:
  1. ([color=BLUE]defun[/color] c:mblk ( [color=BLUE]/[/color] blk enx idx itm ls1 ls2 sel )
  2.    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] [color=MAROON]"_:L"[/color] '((0 . [color=MAROON]"INSERT,LINE"[/color]))))
  3.        ([color=BLUE]progn[/color]
  4.            ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel))
  5.                ([color=BLUE]setq[/color] enx ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx)))))
  6.                ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=MAROON]"INSERT"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 enx)))
  7.                    ([color=BLUE]setq[/color] ls1 ([color=BLUE]cons[/color] ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx))      ([color=BLUE]assoc[/color] -1 enx))  ls1))
  8.                    ([color=BLUE]setq[/color] ls2 ([color=BLUE]cons[/color] ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx)) ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 11 enx))) ls2))
  9.                )
  10.            )
  11.            ([color=BLUE]foreach[/color] blk ls1
  12.                ([color=BLUE]vl-some[/color]
  13.                    ([color=BLUE]function[/color]
  14.                        ([color=BLUE]lambda[/color] ( x [color=BLUE]/[/color] y )
  15.                            ([color=BLUE]if[/color]
  16.                                ([color=BLUE]cond[/color]
  17.                                    (   ([color=BLUE]equal[/color] ([color=BLUE]car[/color] blk) ([color=BLUE]car[/color] x) 1e-
  18.                                        ([color=BLUE]setq[/color] y ([color=BLUE]cdr[/color] x))
  19.                                    )
  20.                                    (   ([color=BLUE]equal[/color] ([color=BLUE]car[/color] blk) ([color=BLUE]cdr[/color] x) 1e-
  21.                                        ([color=BLUE]setq[/color] y ([color=BLUE]car[/color] x))
  22.                                    )
  23.                                )
  24.                                ([color=BLUE]progn[/color]
  25.                                    ([color=BLUE]setq[/color] ls2 ([color=BLUE]vl-remove[/color] x ls2))
  26.                                    ([color=BLUE]entmod[/color] ([color=BLUE]list[/color] ([color=BLUE]cdr[/color] blk) ([color=BLUE]cons[/color] 10 y)))
  27.                                )
  28.                            )
  29.                        )
  30.                    )
  31.                    ls2
  32.                )
  33.            )
  34.        )
  35.    )
  36.    ([color=BLUE]princ[/color])
  37. )
  38.                
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 03:25:33 | 显示全部楼层
 
我只是假设。根据图片,这些线与其他圆不在同一点上。见圆圈4和5。
 
[ATTACH=CONFIG]44488[/ATTACH]
 
我想一个接一个地做。。。我也有和李一样的想法。将端点与起点切换,反之亦然,但OP希望使用镜像。
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 03:31:09 | 显示全部楼层
嘿,伙计们,不使用append我怎么能做到这一点呢。谢谢
 
  1.       
  2.        (append
  3.          (mapcar
  4.            (function
  5.              (lambda (a)
  6.                (cons a
  7.           (distance
  8.             (cdr (assoc 10 (entget x)))
  9.                    (cdr (assoc 10 (entget a)))
  10.                  )           
  11.                )
  12.              )
  13.            ) l
  14.          )
  15.          (mapcar
  16.     (function
  17.              (lambda (a)
  18.                (cons a
  19.                  (distance
  20.                    (cdr (assoc 10 (entget x)))
  21.                    (cdr (assoc 11 (entget a)))
  22.                  )
  23.                )  
  24.              )
  25.            ) l
  26.          )
  27.        )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 03:32:58 | 显示全部楼层
 
对于这种方法,vl排序的使用效率很低:当程序只需要最接近块插入点的项时,无需为foreach循环的每次迭代对列表中的每个项重新排序。
 
对于你的方法,我建议如下:
  1. ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] d1 d2 en id l1 l2 p1 ss )
  2.    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] ss ([color=BLUE]ssget[/color] [color=MAROON]"_:L"[/color] '((0 . [color=MAROON]"INSERT,LINE"[/color]))))
  3.        ([color=BLUE]progn[/color]
  4.            ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] id ([color=BLUE]sslength[/color] ss))
  5.                ([color=BLUE]setq[/color] en ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] ss ([color=BLUE]setq[/color] id ([color=BLUE]1-[/color] id)))))
  6.                ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=MAROON]"INSERT"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 en)))
  7.                    ([color=BLUE]setq[/color] l1 ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 en)) ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] -1 en))) l1))
  8.                    ([color=BLUE]setq[/color] l2 ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 en)) ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 11 en))) l2))
  9.                )
  10.            )
  11.            ([color=BLUE]foreach[/color] br l1
  12.                ([color=BLUE]setq[/color] d1 (dis ([color=BLUE]car[/color] br) ([color=BLUE]car[/color] l2))
  13.                      en ([color=BLUE]car[/color] l2)
  14.                )
  15.                ([color=BLUE]foreach[/color] ln ([color=BLUE]cdr[/color] l2)
  16.                    ([color=BLUE]if[/color] ([color=BLUE]<[/color] ([color=BLUE]setq[/color] d2 (dis ([color=BLUE]car[/color] br) ln)) d1)
  17.                        ([color=BLUE]setq[/color] d1 d2
  18.                              en ln
  19.                        )
  20.                    )
  21.                )
  22.                ([color=BLUE]command[/color] [color=MAROON]"_.mirror"[/color] ([color=BLUE]cadr[/color] br) [color=MAROON]""[/color]
  23.                    [color=MAROON]"_non"[/color] ([color=BLUE]setq[/color] p1 ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '([color=BLUE]lambda[/color] ( a b ) ([color=BLUE]/[/color] ([color=BLUE]+[/color] a b) 2.0)) en)))
  24.                    [color=MAROON]"_non"[/color] ([color=BLUE]polar[/color] p1 ([color=BLUE]+[/color] ([color=BLUE]apply[/color] '[color=BLUE]angle[/color] en) ([color=BLUE]/[/color] [color=BLUE]pi[/color] 2.0)) 1.0)
  25.                    [color=MAROON]"_Y"[/color]
  26.                )
  27.            )
  28.        )
  29.    )
  30.    ([color=BLUE]princ[/color])
  31. )
  32. ([color=BLUE]defun[/color] dis ( a b )
  33.    ([color=BLUE]min[/color] ([color=BLUE]distance[/color] a ([color=BLUE]car[/color] b)) ([color=BLUE]distance[/color] a ([color=BLUE]cadr[/color] b)))
  34. )
  35. ([color=BLUE]princ[/color])

 
仍然没有修改为包含无镜像块。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 03:37:40 | 显示全部楼层
哇。。。伙计们,我在读这些帖子,对此非常满意。。。问题是只在参考线上移动数量不确定的物体,该线从块或物体的中点开始(触摸它),然后使用端点或中点上的镜像移动它。。。但提出的替代方案比我预期的要好。明天我会试试。。。
 
谢谢
回复

使用道具 举报

27

主题

182

帖子

163

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2022-7-6 03:39:29 | 显示全部楼层
不客气CafeJr,让我们知道你进展如何
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 21:04 , Processed in 1.112954 second(s), 75 queries .

© 2020-2025 乐筑天下

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