乐筑天下

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

[编程交流] 将SS移动到Bpoly的质心

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:56:03 | 显示全部楼层 |阅读模式
大家好!
我将尝试解释我要做的事情:
 
1.创建选择集并找到其bbox的中心
2.创建bpoly,在封闭区域内拾取,并找到其bbox的中心
3.将所选内容从其中心移动到B多边形的中心
4、删除bpoly
 
目前,我正在修改Tharwat的一些代码(并添加了Lee Mac的一些函数),但我现在陷入了困境,找不到我的错误:
  1. ;Credits: Tharwat, Lee Mac
  2. (defun c:test (/ s1 l1 cen1 doc e o u spc reg obj cen2)
  3.   (princ "\nSelect objects to move from their center")
  4.   (setq s1 (ssget "_:L"))
  5.   (setq l1 (LM:ssboundingbox s1 ))
  6.   (setq cen1 (apply 'mapcar (cons '(lambda ( a b ) (/ (+ a b) 2.0)) l1)) )
  7. (setq e (entlast))
  8. (if (and (vl-cmdf "_.-boundary" "\" "\")
  9.           (setq o (entlast))
  10.           (not (eq e o))
  11.           (eq (cdr (assoc 0 (entget o))) "LWPOLYLINE")
  12.      )
  13.    (progn
  14.      (setq doc (vla-get-activedocument (vlax-get-acad-object)) )
  15.      (setq spc (vla-get-block (vla-item (vla-get-layouts doc) (getvar 'ctab))) )
  16.      (setq reg (vlax-invoke spc 'addregion (list (setq obj (vlax-ename->vla-object o)))) )
  17.      (if
  18.        (setq cen2 (vlax-3d-point (append (vlax-get (car reg) 'centroid) (list 0.))) )
  19.        (progn
  20.        (command "_move" s1 "" "_non" cen1 "_non" cen2 )
  21.        (mapcar 'vla-delete o)
  22.        (vla-delete (car reg))
  23.        );progn
  24.      );if
  25.    );progn
  26.   );if
  27. ;vlax-safearray->list (vlax-variant-value VAR))
  28. (princ)
  29. )
  30. ;; Selection Set Bounding Box  -  Lee Mac
  31. ;; Returns a list of the lower-left and upper-right WCS coordinates of a
  32. ;; rectangular frame bounding all objects in a supplied selection set.
  33. ;; s - [sel] Selection set for which to return bounding box
  34. (defun LM:ssboundingbox ( s / a b i m n o )
  35.    (repeat (setq i (sslength s))
  36.        (if
  37.            (and
  38.                (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  39.                (vlax-method-applicable-p o 'getboundingbox)
  40.                (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list o 'a 'b))))
  41.            )
  42.            (setq m (cons (vlax-safearray->list a) m)
  43.                  n (cons (vlax-safearray->list b) n)
  44.            )
  45.        )
  46.    )
  47.    (if (and m n)
  48.        (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list m n))
  49.    )
  50. )
  51. (vl-load-com) (princ)

谁能修好它,谁就可以拿走版权(我不在乎)。
我只是想把这件事做完!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:30:47 | 显示全部楼层
你们非常接近请尝试以下操作:
  1. (defun c:test ( / box ent ply pnt reg sel )
  2.    (cond
  3.        (   (not (setq sel (ssget "_:L"))))
  4.        (   (not (setq box (LM:ssboundingbox sel)))
  5.            (princ "\nUnable to calculate bounding box for selection.")
  6.        )
  7.        (   (not (setq pnt (getpoint "\nSpecify point within bounded area: "))))
  8.        (   (progn
  9.                (setq ent (entlast))
  10.                (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "_O" "_P" "" "_non" pnt "")
  11.                (eq ent (setq ply (entlast)))
  12.            )
  13.            (princ "\nUnable to determine boundary from given point.")
  14.        )
  15.        (   (vl-catch-all-error-p
  16.                (setq reg
  17.                    (vl-catch-all-apply 'vlax-invoke
  18.                        (list
  19.                            (vlax-get-property (vla-get-activedocument (vlax-get-acad-object))
  20.                                (if (= 1 (getvar 'cvport))
  21.                                    'paperspace
  22.                                    'modelspace
  23.                                )
  24.                            )
  25.                            'addregion (list (vlax-ename->vla-object ply))
  26.                        )
  27.                    )
  28.                )
  29.            )
  30.            (princ "\nUnable to create region from boundary.")
  31.        )
  32.        (   (vl-cmdf "_.move" sel ""
  33.                "_non" (trans (apply 'mapcar (cons '(lambda ( a b ) (/ (+ a b) 2.0)) box)) 0 1)
  34.                "_non" (vlax-get (car reg) 'centroid)
  35.            )
  36.        )
  37.    )
  38.    (if (and (= 'ename (type ply)) (entget ply))
  39.        (entdel ply)
  40.    )
  41.    (if (and (= 'vla-object (type (car reg))) (vlax-write-enabled-p (car reg)))
  42.        (vla-delete (car reg))
  43.    )
  44.    (princ)
  45. )
  46. ;; Selection Set Bounding Box  -  Lee Mac
  47. ;; Returns a list of the lower-left and upper-right WCS coordinates of a
  48. ;; rectangular frame bounding all objects in a supplied selection set.
  49. ;; s - [sel] Selection set for which to return bounding box
  50. (defun LM:ssboundingbox ( s / a b i m n o )
  51.    (repeat (setq i (sslength s))
  52.        (if
  53.            (and
  54.                (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  55.                (vlax-method-applicable-p o 'getboundingbox)
  56.                (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list o 'a 'b))))
  57.            )
  58.            (setq m (cons (vlax-safearray->list a) m)
  59.                  n (cons (vlax-safearray->list b) n)
  60.            )
  61.        )
  62.    )
  63.    (if (and m n)
  64.        (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list m n))
  65.    )
  66. )
  67. (vl-load-com) (princ)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 19:12:18 | 显示全部楼层
非常感谢你,李!
从您的更正来看,代码似乎重写了一半。(但这很好——它现在有了专业的触感!)
我将例程命名为“MatchCenterBPOLY”
如果你不介意的话,我将写下你作为作者的昵称。
 
顺便说一句,当创建(窗/门)Schledule时(当使用手动绘制的表时),这个例程非常棒。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 23:50 , Processed in 0.530508 second(s), 69 queries .

© 2020-2025 乐筑天下

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