明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8424|回复: 29

如何得到所选图元的最大外形?

  [复制链接]
发表于 2008-7-20 17:07:00 | 显示全部楼层 |阅读模式

       请问各位大侠我选择左边所示的图元(可能为多段线,也可能为单个的简单图元),通过Lisp如何得到右图红线所示的所选图元的最大外形?

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-2-22 21:00:40 | 显示全部楼层
不能去掉内部的轮廓线啊,求优化
发表于 2008-7-20 18:44:00 | 显示全部楼层

我试了一下,应该可以得到,

我先将所有的图元炸开为单线,

再用"getboundingbox"取得所选图元集的包容框,

再以包容框的点外偏,作一矩形,也就是相当一个"回"字。

然后用下面的句子,就可以得到两个矩形,

你用过滤就可以得到你想要的图形了,

  (setq p1 (getpoint "\n>>>>>选择选择封闭图元内一点==>"))
  (command "bpoly" p1 "")

发表于 2008-7-20 20:07:00 | 显示全部楼层
  1. ;得到最大外形 by weltion
  2. (defun c:getboundary(/ ACADAPP ACADDOC ACADSPC BDOBJ BLENT BLNAME BLOBJ DST HENT HOBJ HPT LENT LPT MAXAREA MAXOBJ OBJ OBJA OSMODE PT0 PT1 PT2 PT3 PT4 SLTSET UPT)
  3.   
  4.   ;加载vlisp函数
  5.   (vl-load-com)
  6.   ;ACD应用程序
  7.   (setq acadapp (vlax-get-acad-object)
  8. ;当前文档
  9. acaddoc (vla-get-activedocument acadapp)
  10. )
  11.   ;当前工作空间
  12.   (if (= (getvar "TILEMODE") 1)(setq acadspc (vla-get-modelspace acaddoc))(setq acadspc (vla-get-paperspace acaddoc)))
  13.   ;选择处理对象
  14.   (if (setq sltset (ssget))
  15.    
  16.     (progn
  17.       ;保存用户捕捉
  18.       (setq osmode (getvar "OSMODE"))
  19.       ;关闭捕捉
  20.       (setvar "OSMODE" 0)
  21.       ;获取当前时间
  22.       (setq blname (rtos (getvar "CDATE")))
  23.       ;制作成图块
  24.       (command "block" blname '(0 0 0) sltset "")
  25.       ;插入块
  26.       (command "insert" blname '(0 0 0) 1 1 0)
  27.       ;块图元名
  28.       (setq blent (entlast)
  29.             ;转成VLA对象
  30.      blobj (vlax-ename->vla-object blent)
  31.      )
  32.       ;求块最大外框
  33.       (vla-getboundingbox blobj 'lpt 'upt)
  34.       ;转化外框坐标
  35.       (setq lpt (vlax-safearray->list lpt)
  36.      upt (vlax-safearray->list upt)
  37.      ;屏幕距离
  38.      dst (getvar "VIEWSIZE")
  39.      
  40.      )
  41.       ;构造外框4个顶点坐标
  42.       (setq pt1 lpt
  43.      pt2 (list (car lpt) (cadr upt) 0)
  44.      pt3 upt
  45.      pt4 (list (car upt) (cadr lpt) 0)
  46.      ;构造一个空的数组
  47.      pt0 (vlax-make-safearray vlax-vbdouble '(0 . 11))
  48.      )
  49.       ;将4个顶点填充入数组
  50.       (vlax-safearray-fill pt0 (append pt1 pt2 pt3 pt4))
  51.       ;创建最大外框
  52.       (setq bdobj (vla-addpolyline acadspc pt0))
  53.       ;close it
  54.       (vla-put-closed bdobj :vlax-true)
  55.       ;向外偏移构造辅助边界线
  56.       (setq hobj  (car (vlax-safearray->list (vlax-variant-value (vla-offset bdobj (* -2 dst)))))
  57.      ;转化为图元名
  58.      hent (vlax-vla-object->ename hobj)
  59.      )
  60.       ;求一个辅助点
  61.       (setq hpt (polar lpt pi dst))
  62.       ;获得最后一个图元
  63.       (setq lent (entlast)
  64.      maxarea nil
  65.      maxobj nil
  66.      )
  67.       ;创造外形
  68.       (command "boundary" "A" "B" "N" blent hent "" "" hpt "")
  69.       ;找出面积最大的外形
  70.       (while (setq lent (entnext lent))
  71. (if (and (= (vla-get-objectname (setq obj (vlax-ename->vla-object lent))) "AcDbPolyline") (> (setq obja (vla-get-area obj)) maxarea))
  72.    (setq maxarea obja maxobj obj)
  73.    )
  74. )
  75.       ;删除辅助对象
  76.       (vla-erase hobj)
  77.       (vla-erase bdobj)
  78.       (vla-erase maxobj)
  79.       ;炸开块并清理块
  80.       (command "explode" blent "purge" "B" blname "" "Y")
  81.       ;恢复用户设置
  82.       (setvar "OSMODE" osmode)
  83.       
  84.       )
  85.     )
  86.   ;good job
  87.   (princ)
  88.   
  89.   )     
  90.       
  91.   

评分

参与人数 1明经币 +1 收起 理由
jfxia + 1 赞一个!

查看全部评分

 楼主| 发表于 2008-7-20 21:21:00 | 显示全部楼层
     谢谢楼上两位出手相助,我先去试试.明经上有这么多热心人士,一定会办得更好!
发表于 2008-7-21 10:39:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-7-21 10:53:00 | 显示全部楼层

得到数据后undo回去,而不要去炸开

这样的方法有时会产生孤岛的问题

发表于 2008-7-21 12:21:00 | 显示全部楼层

没看懂。。。呵呵

给个自己的思路:

(command "._region"...

同样判断取得最大面积的面域后,删除其它。

最大面积的面域即最外轮廓

发表于 2008-7-21 13:00:00 | 显示全部楼层

论坛编译错误,把我的hent (vlax-vla-object->ename hobj)改成
hent (vla-object->ename.htm target=_black>vlax-vla-object->ename hobj)了

发表于 2008-7-21 13:27:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-7-21 14:05:00 | 显示全部楼层

CAD2008

本帖子中包含更多资源

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

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 09:58 , Processed in 0.260691 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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