明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6266|回复: 17

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

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

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

本帖子中包含更多资源

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

x
发表于 2008-11-1 20:20:00 | 显示全部楼层
sieben发表于2008-7-21 9:38:0042636 1,获取全部实体选择集,要求外围是封闭的 2,获取选择集的矩形绿色轮廓,使用getboundingbox函数可以实现 3,将绿色轮廓再向外偏移一定距离得到黄色轮廓 4,取一绿色黄色轮廓间的点,使用Bo

通过选择集,对选择集再进行GetBoundingBox

回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-28 15:16:34 | 显示全部楼层

感谢分享,可用!
发表于 2023-9-2 11:17:21 | 显示全部楼层
好用  精准  
发表于 2008-7-20 22:27:00 | 显示全部楼层

1、遍历判断

2、做成块或者是组合成多段线用getbound来获得

发表于 2008-7-20 23:00:00 | 显示全部楼层

lz的意思非常难以实现。

getboundingbox 只是一个矩形区域的坐标点。

发表于 2008-7-21 09:38:00 | 显示全部楼层
本帖最后由 作者 于 2008-7-21 9:47:02 编辑

  1,获取全部实体选择集,要求外围是封闭的 2,获取选择集的矩形绿色轮廓,使用getboundingbox函数可以实现 3,将绿色轮廓再向外偏移一定距离得到黄色轮廓 4,取一绿色黄色轮廓间的点,使用Boundary命令可以得到5两个紫色轮廓 5,干掉第5步中外面的轮廓,即可得到第6轮廓

本帖子中包含更多资源

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

x
发表于 2008-7-21 20:45:00 | 显示全部楼层
通过面积能判断吗?
 楼主| 发表于 2008-7-22 19:05:00 | 显示全部楼层
     谢谢楼上各位的回复,特别是sieben的详细解答!
发表于 2008-10-17 12:07:00 | 显示全部楼层

有代码吗?可以给我留个不·谢谢

发表于 2008-10-19 09:57:00 | 显示全部楼层
  1. ;;;包裹描边
  2. ; getArea subRoutine
  3. (defun getArea ( entName / )
  4.    (command "_.AREA" "O" entName)
  5.    (setq objArea (getvar "AREA"))
  6. ) ;defun
  7. (defun c:wq(/ oldEcho objsToWrap extMin extMax minX minY maxX maxY
  8.                    diagDist boxOffset boxLL boxLR boxUR boxUL
  9.                    boundPoint boxObj newObjs lastEntName entName
  10.                    newObjsLen maxArea counter thisArea wrapOption
  11.                )
  12.    (setq oldEcho (getvar "CMDECHO"))
  13.    (setvar "CMDECHO" 0)
  14.    (prompt "\nWrap Objects (w/Polyline(s)):")
  15.    ;|
  16.        Swap commenting with (setq) line below...
  17.        If you want ELLIPSE and SPLINE objects to be selectable
  18.    |;
  19.    ;(setq objsToWrap (ssget))
  20.    (setq objsToWrap
  21.        (ssget '(
  22.            (-4 . "<NOT")
  23.                (-4 . "<OR")
  24.                    (0 . "ELLIPSE")
  25.                    (0 . "SPLINE")
  26.                (-4 . "OR>")
  27.            (-4 . "NOT>"))
  28.        ) ;ssget
  29.    ) ;setq
  30.    
  31.    (if (/= objsToWrap nil)
  32.        (progn
  33.            (command "_.UNDO" "BEGIN")
  34.            (setq wrapOption "Single") ;default to single
  35.            (initget "Single Multiple")
  36.            (prompt "\nWrap Options:")
  37.            (prompt "\n   Single: Only the largest outer profile will be created.")
  38.            (prompt "\n   Multiple: Nested, or detatched profiles will also be created.")
  39.            (setq wrapOption (getkword "\nWrap option [Single/Multiple] <Single>: "))
  40.            (if (= wrapOption "Multiple")
  41.                (setq wrapOption "Multiple")
  42.                (setq wrapOption "Single")
  43.            ) ;if
  44.            
  45.            ; Create bounding box, larger than existing drawing...
  46.            (setq extMin (getvar "EXTMIN"))
  47.            (setq extMax (getvar "EXTMAX"))
  48.            (setq minX (car extMin))
  49.            (setq minY (cadr extMin))
  50.            (setq maxX (car extMax))
  51.            (setq maxY (cadr extMax))
  52.            
  53.            (setq diagDist (distance extMin extMax))
  54.            (setq boxOffset (* diagDist 0.1))
  55.            
  56.            (setq boxLL (list (- minX boxOffset) (- minY boxOffset) 0))
  57.            (setq boxLR (list (+ maxX boxOffset) (- minY boxOffset) 0))
  58.            (setq boxUR (list (+ maxX boxOffset) (+ maxY boxOffset) 0))
  59.            (setq boxUL (list (- minX boxOffset) (+ maxY boxOffset) 0))
  60.            (setq boundPoint (list (- minX (/ boxOffset 2)) (- minY (/ boxOffset 2)) 0))
  61.            (command "_.PLINE" boxLL boxLR boxUR boxUL "C")
  62.            (setq boxObj (entlast))
  63.            (command "_.-BOUNDARY" "A" "O" "P" "I" "Y" "B" "N" boxObj objsToWrap "" "" boundPoint "")
  64.            
  65.            ; Get a list of the entities created by the boundary command...
  66.            (setq lastEntName boxObj)
  67.            (while (setq entName (entnext lastEntName))
  68.                (setq newObjs (append newObjs (list entName)))
  69.                (setq lastEntName entName)
  70.            ) ;while
  71.            ;Get the greatest object area, of the new objects (the duplicate polyline, of our temp box)
  72.            (setq newObjsLen (length newObjs))
  73.            (setq maxArea 0)
  74.            
  75.            (setq counter 0)
  76.            (while (< counter newObjsLen)
  77.                (setq thisArea (getArea (nth counter newObjs)))
  78.                (if (>= thisArea maxArea)
  79.                    (setq maxArea thisArea)
  80.                ) ;if
  81.                (setq counter (1+ counter))
  82.            ) ;while
  83.            
  84.            ; Delete the Object, that matches the maxArea (the duplicate polyline)
  85.            (setq counter 0)
  86.            (while (< counter newObjsLen)
  87.                (setq thisArea (getArea (nth counter newObjs)))
  88.                (if (= thisArea maxArea)
  89.                    (progn
  90.                        (entdel (nth counter newObjs))
  91.                        (setq counter newObjsLen) ;break loop
  92.                    ) ;progn
  93.                ) ;if
  94.                (setq counter (1+ counter))
  95.            ) ;while
  96.            
  97.            (if (= wrapOption "Single")
  98.                (progn
  99.                    ; Get the REMAINING new objects...
  100.                    (setq newObjs nil)
  101.                    (setq lastEntName boxObj)
  102.                    (while (setq entName (entnext lastEntName))
  103.                        (setq newObjs (append newObjs (list entName)))
  104.                        (setq lastEntName entName)
  105.                    ) ;while
  106.                    ; Get the NEXT greatest object area, of the REMAINING new objects (this is the one we want to keep!)
  107.                    (setq newObjsLen (length newObjs))
  108.                    (setq maxArea 0)
  109.                    (setq counter 0)
  110.                    (while (< counter newObjsLen)
  111.                        (setq thisArea (getArea (nth counter newObjs)))
  112.                        (if (>= thisArea maxArea)
  113.                            (setq maxArea thisArea)
  114.                        ) ;if
  115.                        (setq counter (1+ counter))
  116.                    ) ;while
  117.                    ; Delete the Object, UNLESS it matches the maxArea (the one we want to keep!)...
  118.                    (setq counter 0)
  119.                    (while (< counter newObjsLen)
  120.                        (setq thisArea (getArea (nth counter newObjs)))
  121.                        (if (/= thisArea maxArea)
  122.                            (progn
  123.                                (entdel (nth counter newObjs))
  124.                            ) ;progn
  125.                        ) ;if
  126.                        (setq counter (1+ counter))
  127.                    ) ;while
  128.                ) ;progn
  129.            ) ;if
  130.            
  131.            ;Erase the original box...
  132.            (command "_.ERASE" boxObj "")
  133.            (command "_.UNDO" "END")
  134.        ) ;progn
  135.    ) ;if
  136.    (setvar "CMDECHO" oldEcho)
  137.    (princ)
  138. ) ;defun
  139. ;(prompt "\nWrapObjects.lsp...Loaded!")
  140. (prompt "\nPCB模具设计:a 外形-0.075单边 内槽+0.075单 1.6T IF 1.0T 0.05单边 线路+绿油+正字符+阻焊+反字符+碳油 先想清楚再下手做,磨刀不误砍柴工! ")
  141. (princ)

评分

参与人数 1金钱 +20 收起 理由
gbhsu + 20 下了就要顶,好东西!

查看全部评分

发表于 2008-10-20 11:46:00 | 显示全部楼层
谢谢,真是个好东西,貌似不怎么看的懂,慢慢研究中···
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 03:04 , Processed in 0.179582 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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