乐筑天下

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

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

[复制链接]

39

主题

97

帖子

6

银币

后起之秀

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

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

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-1-13 18:03:00 | 显示全部楼层
你把测试的程序和出错的测试图给一个看看
回复

使用道具 举报

39

主题

97

帖子

6

银币

后起之秀

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

铜币
253
发表于 2004-1-14 07:37:00 | 显示全部楼层

zjicfgyvhz2.jpg

zjicfgyvhz2.jpg


图上的多义线都算错了,其它的图,如圆,线,及多段线都算正确了。
下面是源代码
(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)
  )
回复

使用道具 举报

39

主题

97

帖子

6

银币

后起之秀

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

铜币
253
发表于 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))
)
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 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

绘出的图形:

u13brhascpb.jpg

u13brhascpb.jpg

回复

使用道具 举报

39

主题

97

帖子

6

银币

后起之秀

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

铜币
253
发表于 2004-1-14 09:40:00 | 显示全部楼层
这个函数返回的值针对同一个图形有时候是正确的,有时候又是错误的,有没有办法避免错误的情况出现。或者说能不能找到函数出现运行错误的规律
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2004-1-14 10:01:00 | 显示全部楼层
找规律是没办法,但看是否正确还是有办法,可以计算框与图元的交点数,对于封闭的样条线及拟合化的多段线,框与图元的交点应该有四个。
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 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. )
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2004-1-14 13:18:00 | 显示全部楼层
试过以上我绘的几个图形,
拟合过的多段线:还是那个框。
样条曲线:框小了,但还不是要求的框,看了一下,外框还把控制点给包含进来了。
回复

使用道具 举报

20

主题

872

帖子

10

银币

中流砥柱

Rank: 25

铜币
952
发表于 2004-1-14 23:28:00 | 显示全部楼层
offset有时候会得出好几段来,用entlast未必能得到想要的曲线
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-8 04:40 , Processed in 0.918562 second(s), 75 queries .

© 2020-2025 乐筑天下

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