找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 980|回复: 8

[每日一码] 获取选择集,图块(动态块)的轮廓线

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2021-1-17 04:05:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

objectoutline.gif

outlineblocktest.gif

  1. (defun c:outline ( / sel )
  2.     (if (setq sel (ssget))
  3.         (sssetfirst nil (LM:outline sel))
  4.     )
  5.     (princ)
  6. )

  7. ;; Object Outline  -  Lee Mac
  8. ;; Attempts to generate a polyline outlining the selected objects.
  9. ;; sel - [sel] Selection Set to outline

  10. (defun LM:outline ( sel / app are box cmd dis enl ent lst obj rtn tmp )
  11.     (setq app (vlax-get-acad-object)
  12.           box (LM:ssboundingbox sel)
  13.           dis (/ (apply 'distance box) 20.0)
  14.           lst (mapcar '(lambda ( a o ) (mapcar o a (list dis dis))) box '(- +))
  15.           are (apply '* (apply 'mapcar (cons '- (reverse lst))))
  16.           dis (* dis 1.5)
  17.           ent
  18.         (entmakex
  19.             (append
  20.                '(   (000 . "LWPOLYLINE")
  21.                     (100 . "AcDbEntity")
  22.                     (100 . "AcDbPolyline")
  23.                     (090 . 4)
  24.                     (070 . 1)
  25.                 )
  26.                 (mapcar '(lambda ( x ) (cons 10 (mapcar '(lambda ( y ) ((eval y) lst)) x)))
  27.                    '(   (caar   cadar)
  28.                         (caadr  cadar)
  29.                         (caadr cadadr)
  30.                         (caar  cadadr)
  31.                     )
  32.                 )
  33.             )
  34.         )
  35.     )
  36.     (apply 'vlax-invoke
  37.         (vl-list* app 'zoomwindow
  38.             (mapcar '(lambda ( a o ) (mapcar o a (list dis dis 0.0))) box '(- +))
  39.         )
  40.     )
  41.     (setq cmd (getvar 'cmdecho)
  42.           enl (entlast)
  43.           rtn (ssadd)
  44.     )
  45.     (while (setq tmp (entnext enl)) (setq enl tmp))
  46.     (setvar 'cmdecho 0)
  47.     (command
  48.         "_.-boundary" "_a" "_b" "_n" sel ent "" "_i" "_y" "_o" "_p" "" "_non"
  49.         (trans (mapcar '- (car box) (list (/ dis 3.0) (/ dis 3.0))) 0 1) ""
  50.     )
  51.     (while (< 0 (getvar 'cmdactive)) (command ""))
  52.     (entdel ent)
  53.     (while (setq enl (entnext enl))
  54.         (if (and (vlax-property-available-p (setq obj (vlax-ename->vla-object enl)) 'area)
  55.                  (equal (vla-get-area obj) are 1e-4)
  56.             )
  57.             (entdel enl)
  58.             (ssadd  enl rtn)
  59.         )
  60.     )
  61.     (vla-zoomprevious app)
  62.     (setvar 'cmdecho cmd)
  63.     rtn
  64. )

  65. ;; Selection Set Bounding Box  -  Lee Mac
  66. ;; Returns a list of the lower-left and upper-right WCS coordinates of a
  67. ;; rectangular frame bounding all objects in a supplied selection set.
  68. ;; s - [sel] Selection set for which to return bounding box

  69. (defun LM:ssboundingbox ( s / a b i m n o )
  70.     (repeat (setq i (sslength s))
  71.         (if
  72.             (and
  73.                 (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  74.                 (vlax-method-applicable-p o 'getboundingbox)
  75.                 (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-getboundingbox (list o 'a 'b))))
  76.             )
  77.             (setq m (cons (vlax-safearray->list a) m)
  78.                   n (cons (vlax-safearray->list b) n)
  79.             )
  80.         )
  81.     )
  82.     (if (and m n)
  83.         (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list m n))
  84.     )
  85. )

  86. (vl-load-com) (princ)


另外一个实现代码:

  1. ;Lee Mac's Code Modified from: http://www.theswamp.org/index.php?topic=48031.msg530751#msg530751
  2. ;; Object Outline  -  Lee Mac
  3. ;; Attempts to generate a polyline outlining the selected objects.
  4. (defun ECO (sel / a b c d e o p s x y)
  5.   (command "._isolateobjects" sel "")
  6.   (setq b (LM:ssboundingbox sel)
  7.                   d (/ (apply 'distance b) 20.0)
  8.                   p (mapcar '(lambda (a o) (mapcar o a (list d d))) b '(- +))
  9.                   a (apply '* (apply 'mapcar (cons '- (reverse p))))
  10.                   d (* d 1.5)
  11.                   e (entmakex
  12.               (append
  13.                 '(
  14.                   (000 . "LWPOLYLINE")
  15.                   (100 . "AcDbEntity")
  16.                   (100 . "AcDbPolyline")
  17.                   (090 . 4)
  18.                   (070 . 1)
  19.                  )
  20.                 (mapcar
  21.                   '(lambda (x) (cons 10 (mapcar '(lambda (y) ((eval y) p)) x)))
  22.                   '(
  23.                     (caar cadar)
  24.                     (caadr cadar)
  25.                     (caadr cadadr)
  26.                     (caar cadadr)
  27.                    )
  28.                 )
  29.               )
  30.             )
  31.   )
  32.    (setq c (getvar 'cmdecho)
  33.           x (entlast)
  34.     )
  35.     (while (setq y (entnext x)) (setq x y))
  36.     (setvar 'cmdecho 0)
  37.   (command "._-boundary" "_a" "_b" "_n" sel e "" "_i" "_y" "_o" "_p" "" "_non" (trans (car b) 0 1) "")
  38.   (while (< 0 (getvar 'cmdactive)) (command ""))
  39.   (entdel e)
  40.     (command "._unisolateobjects")

  41. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2021-1-17 15:48:23 | 显示全部楼层
好东西,顶了学习一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2021-10-16 17:18:49 | 显示全部楼层
非常好的帖子,现在正好需要这个,非常感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-10-20 14:19:26 | 显示全部楼层
学习一下,这个不错,可以改进一下我的代码了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 244个

财富等级: 日进斗金

发表于 2021-11-2 19:06:23 | 显示全部楼层
老大的代码就是强  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-11-3 14:44:44 | 显示全部楼层
如果中间有几处断开缺口了,也能否取得外轮廓线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2022-5-18 16:24:53 | 显示全部楼层
同6楼,如果中间有几处断开缺口了,也能否取得外轮廓线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3733个

财富等级: 富可敌国

发表于 2022-5-18 22:00:38 | 显示全部楼层
学习一下,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2024-3-27 14:38:19 | 显示全部楼层
win10 1909 CAD2020.1.2 提示语法错误。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-29 06:29 , Processed in 0.322859 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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