乐筑天下

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

GetBoundingBox返回0,0,0?

[复制链接]

13

主题

117

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2006-11-6 06:08:26 | 显示全部楼层 |阅读模式
我在目前正在写的剧本中偶然发现了一个大问题。
该例程主要检查重叠层-它通过将参考多边形复制到一个区域并进行一系列减法来计算多边形与另一个多边形重叠的程度(如果有)。
如果参考多边形完全包含在另一个多边形内(如果它更小),或者如果参考多边形与另一个多边形重叠,该脚本可以很好地工作。然而,如果多边形有不止一次接触的顶点(例如,它们是相同的形状,或者共享一系列的顶点),那么当我运行getboundingbox命令时,数组minExt和maxExt都返回0,0,0。
这是getboundingbox命令的限制吗,有人知道如何解决这个问题吗?
-托尼

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

5

主题

65

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
93
发表于 2006-11-6 07:13:06 | 显示全部楼层
一个小小的代码片段将在这里起到很大的作用。。。。
回复

使用道具 举报

13

主题

117

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2006-11-6 07:36:20 | 显示全部楼层

  1.     entry.GetBoundingBox minExt, maxExt
  2.    
  3.     startPtD(0) = minExt(0) + 1: startPtD(1) = maxExt(1): startPtD(2) = 0#
  4.     endPtD(0) = minExt(0) + 1: endPtD(1) = minExt(1): endPtD(2) = 0#
  5.     startPt = startPtD: endPt = endPtD
  6.    
  7.     Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt)
  8.    
  9.     intPointsNew = entry.IntersectWith(lineObj, acExtendNone)
  10.    
  11.         startPtD(0) = intPointsNew(0) - 10: startPtD(1) = intPointsNew(1): startPtD(2) = intPointsNew(2)
  12.         endPtD(0) = intPointsNew(3) - 10: endPtD(1) = intPointsNew(4): endPtD(2) = intPointsNew(5):

我真的没有什么可以发布的了——当我想要比较的两个lw折线嵌套时,这段代码工作得很好——即getboundingbox返回值。当有多个顶点与外部多段线接触时,getboundingbox返回minExt 0,0,0和maxExt 0,0,0。
所有变量都已声明,并且声明正确,我只是不明白为什么当这些行接触时,getboundingbox命令在两个数组中都返回值0-即它正在*填充*数组,只是数据不正确:/
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2006-11-6 08:40:14 | 显示全部楼层
Mayby我写的一些代码中的一个例子可以帮助你找到你的问题......
对不起,我已经用我的母语评论了它。
看着代码,我似乎记得我不得不使用变体,因为在涉及Getboundingbox
  1. Function LimitsSelSet(Selset As AcadSelectionSet) As Variant
  2. Dim Ent As AcadEntity
  3. Dim LL As Variant
  4. Dim UR As Variant
  5. Dim Limits(0 To 1, 0 To 2) As Double
  6. Limits(0, 0) = -0.0000000000001
  7. For Each Ent In Selset
  8.     If Left$(Ent.ObjectName, 7)  "AcDbDim" And Ent.ObjectName  "AcDbAttributeDefinition" _
  9.             And Ent.ObjectName  "AcDBText" Then 'negeer dimensies attributen en texten
  10.         
  11.         Ent.GetBoundingBox LL, UR
  12.         If Limits(0, 0) = -0.0000000000001 Then  'init upperleft, lowerright
  13.             Limits(0, 0) = LL(0): Limits(0, 1) = LL(1): Limits(0, 2) = LL(2)
  14.             Limits(1, 0) = UR(0): Limits(1, 1) = UR(1): Limits(1, 2) = UR(2)
  15.         Else 'get boundingbox selectionset
  16.             If Limits(0, 0) > LL(0) Then Limits(0, 0) = LL(0)
  17.             If Limits(0, 1) > LL(1) Then Limits(0, 1) = LL(1)
  18.             If Limits(0, 2) > LL(2) Then Limits(0, 2) = LL(2)
  19.             If Limits(1, 0)  5 Then
  20.         StartPtd(0) = intPointsNew(0) - 10
  21.         StartPtd(1) = intPointsNew(1)
  22.         StartPtd(2) = intPointsNew(2)
  23.         EndPtD(0) = intPointsNew(3) - 10
  24.         EndPtD(1) = intPointsNew(4)
  25.         EndPtD(2) = intPointsNew(5)
  26.     End If
  27. End If
  28. End Sub

回复

使用道具 举报

13

主题

117

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2006-11-6 08:59:22 | 显示全部楼层

是的,我很早就知道了...我来自一个更“纯粹”的编程背景(如...编写完全独立的可执行文件),而不是通过对象库等编写脚本——这是我在过去2年左右才做的事情,使用AutoCAD大约3/4个月。
  1.     Dim lineObj As AcadLine
  2.     Dim startPt As Variant
  3.     Dim endPt As Variant
  4.    
  5.     Dim startPtD(2) As Double
  6.     Dim endPtD(2) As Double
  7.    
  8.     Dim minExt As Variant
  9.     Dim maxExt As Variant
  10.     Dim intPointsNew As Variant

加载start PtD(双打数组)然后将值从那里加载到start Pt(变体数组)的混乱是由于这样一个事实,即当您想检查针对弧(或任何包含弧的内容)的拦截时,它必须是包含“变体/双打”类型数据的变体数组——这正是您提到的怪癖之一。
回复

使用道具 举报

6

主题

94

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2006-11-6 09:32:05 | 显示全部楼层
问题可能在这里发生。如果减去 2 个相同的对象,则没有剩余空间来获取
回复

使用道具 举报

13

主题

117

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2006-11-6 09:44:11 | 显示全部楼层
尽管这似乎是一个不错的解决方案,但该对象没有从中减去任何东西(如果您考虑它,我会得到一个不同的错误 - 它会失败,因为“entry”将不再存在)
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-11-6 09:49:26 | 显示全部楼层
这里的重点是你没有展示足够多的代码。我们只能猜测。据我所知,一个多边形与另一个多边形共享一些点的事实不会改变Getboundingbox的结果,它只会查看你给它的实体。
回复

使用道具 举报

13

主题

117

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
173
发表于 2006-11-6 09:53:22 | 显示全部楼层
我没有其他代码可以给你看,都和这个函数无关。我本以为也是这样,但是就像我说的,它一直有效,直到你接触到另一条有不止一个顶点的线。我用entry(这是一个区域)来填充它,如果entry不止一次接触折线,那么它将返回值0,0,0。我没有其他代码可以给你看。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2006-11-6 10:10:44 | 显示全部楼层
Dnereb:我刚刚看到你的编辑。 谢谢,我测试了它,我也没有问题 - 虽然我不明白为什么该代码有效,而我的代码不起作用:/
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-6 21:21 , Processed in 1.642750 second(s), 72 queries .

© 2020-2025 乐筑天下

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