明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4468|回复: 13

大家有没有发现 GetBoundingBox 有时对spline求不出正确的结果。

  [复制链接]
发表于 2004-1-13 17:43:00 | 显示全部楼层 |阅读模式
大家有没有发现 GetBoundingBox 有时对spline求不出正确的结果。
我编了两个程序,两个程序在对spline执行过程中有时候正确,有时候又不正确。一步一步跟踪就会发现 GetBoundingBox 会传回来错误的数值。
而对其它的图元都没有问题。
不知道大家有没有遇到过这样的情况。
发表于 2004-1-13 18:03:00 | 显示全部楼层
你把测试的程序和出错的测试图给一个看看
 楼主| 发表于 2004-1-14 07:37:00 | 显示全部楼层

图上的多义线都算错了,其它的图,如圆,线,及多段线都算正确了。
下面是源代码
(defun c:test(/ st js pt_list pt1 pt2)
  (SETQ st (SSGET '(( 0 . "line,circle,arc,LWPOLYLINE,SPLINE,ELLIPSE"))))
  (vl-cmdf ".ucs" "")
  (setvar "osmode" 0)
  
  (setq js 0  pt_list nil)
  (repeat (sslength st)
    (setq PT_LIST (append PT_LIST (AX:GETBOUNDINGBOX (ssname st js))))
    (setq js (1+ js))
    )
  (setq PT1 (list (apply 'min (mapcar 'car  PT_LIST))
                  (apply 'min (mapcar 'cadr PT_LIST))
                  )
        PT2 (list (apply 'max (mapcar 'car  PT_LIST))
                  (apply 'max (mapcar 'cadr PT_LIST))
                  )     
            )
  (vl-cmdf ".RECTANG" pt1 pt2)
  )

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-1-14 07:41:00 | 显示全部楼层
这个是上面那个程序的 AX:GETBOUNDINGBOX 函数的源代码
(defun AX:GETBOUNDINGBOX (ENT / LL UR)
  (vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
  (mapcar 'vlax-safearray->list (list LL UR))
)
发表于 2004-1-14 09:21:00 | 显示全部楼层
确实存在BUG,以下为VBA程序
  1. Sub DB()
  2.     Dim ent As AcadEntity
  3.     Dim pnt As Variant
  4.     ThisDrawing.Utility.GetEntity ent, pnt, vbCr & "选择对象:"
  5.     DrawBoundingBox ent
  6. End Sub


  7. Public Function DrawBoundingBox(ent As AcadEntity) As AcadLWPolyline
  8.     Dim min, max
  9.     ent.GetBoundingBox min, max
  10.     Set DrawBoundingBox = Rectangle(min, max)
  11. End Function

  12. Public Function Rectangle(Point1, Point2) As AcadLWPolyline
  13.     Dim vertices(0 To 7) As Double, pl As AcadLWPolyline
  14.     vertices(0) = CDbl(Point1(0)): vertices(1) = CDbl(Point1(1))
  15.     vertices(2) = CDbl(Point2(0)): vertices(3) = CDbl(Point1(1))
  16.     vertices(4) = CDbl(Point2(0)): vertices(5) = CDbl(Point2(1))
  17.     vertices(6) = CDbl(Point1(0)): vertices(7) = CDbl(Point2(1))
  18.     Set pl = ThisDrawing.ModelSpace.AddLightWeightPolyline(vertices)
  19.     pl.Closed = True
  20.     Set Rectangle = pl
  21. End Function


绘出的图形:

本帖子中包含更多资源

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

x
 楼主| 发表于 2004-1-14 09:40:00 | 显示全部楼层
这个函数返回的值针对同一个图形有时候是正确的,有时候又是错误的,有没有办法避免错误的情况出现。或者说能不能找到函数出现运行错误的规律
发表于 2004-1-14 10:01:00 | 显示全部楼层
找规律是没办法,但看是否正确还是有办法,可以计算框与图元的交点数,对于封闭的样条线及拟合化的多段线,框与图元的交点应该有四个。
发表于 2004-1-14 11:38:00 | 显示全部楼层

  1. ;;OFFSET 2次,一进一出,可以缩少误差,但不一定正确
  2. (defun GETBOUNDINGBOX_LAI (ENT / LL UR EN1 EN2 TYP)
  3.   (setq TYP (cdr (assoc 0 (entget ENT))))
  4.   (if (and (/= TYP "XLINE") (/= TYP "RAY"))
  5.     (if        (= "SPLINE" TYP)
  6.       (progn
  7.         (setq EN (vlax-ename->vla-object ENT))
  8.         ;;可能会不能OFFSET
  9.         ;;---------------------
  10.         (vl-catch-all-apply
  11.           'vla-offset
  12.           (list EN 1)
  13.           ;;OFFSET距离还在测试
  14.         )
  15.         (setq EN1 (entlast))
  16.         (vl-catch-all-apply
  17.           'vla-offset
  18.           (list (vlax-ename->vla-object EN1) -1)
  19.           ;;OFFSET距离还在测试
  20.         )
  21.         ;;--------------------------
  22.         (entdel EN1)
  23.         (setq EN2 (entlast))
  24.         (vla-getboundingbox (vlax-ename->vla-object EN2) 'LL 'UR)
  25.         (entdel EN2)
  26.         (mapcar 'vlax-safearray->list (list LL UR))
  27.       )
  28.       (progn
  29.         (vla-getboundingbox (vlax-ename->vla-object ENT) 'LL 'UR)
  30.         (mapcar 'vlax-safearray->list (list LL UR))
  31.       )
  32.     )
  33.   )
  34. )

  35. (defun C:TT (/ ENT BOX)
  36.   (setvar "OSMODE" 0)
  37.   (setq ENT (car (entsel)))
  38.   (setq BOX (GETBOUNDINGBOX_LAI ENT))
  39.   (vl-cmdf ".RECTANG" (car BOX) (cadr BOX))
  40.   (princ)
  41. )
发表于 2004-1-14 13:18:00 | 显示全部楼层
试过以上我绘的几个图形,
拟合过的多段线:还是那个框。
样条曲线:框小了,但还不是要求的框,看了一下,外框还把控制点给包含进来了。
发表于 2004-1-14 23:28:00 | 显示全部楼层
offset有时候会得出好几段来,用entlast未必能得到想要的曲线
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 12:35 , Processed in 0.175277 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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