Tuoni 发表于 2006-11-6 06:08:26

GetBoundingBox返回0,0,0?

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

Swift 发表于 2006-11-6 07:13:06

一个小小的代码片段将在这里起到很大的作用。。。。

Tuoni 发表于 2006-11-6 07:36:20



    entry.GetBoundingBox minExt, maxExt
   
    startPtD(0) = minExt(0) + 1: startPtD(1) = maxExt(1): startPtD(2) = 0#
    endPtD(0) = minExt(0) + 1: endPtD(1) = minExt(1): endPtD(2) = 0#
    startPt = startPtD: endPt = endPtD
   
    Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt)
   
    intPointsNew = entry.IntersectWith(lineObj, acExtendNone)
   
      startPtD(0) = intPointsNew(0) - 10: startPtD(1) = intPointsNew(1): startPtD(2) = intPointsNew(2)
      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-即它正在*填充*数组,只是数据不正确:/

Dnereb 发表于 2006-11-6 08:40:14

Mayby我写的一些代码中的一个例子可以帮助你找到你的问题......
对不起,我已经用我的母语评论了它。
看着代码,我似乎记得我不得不使用变体,因为在涉及Getboundingbox
Function LimitsSelSet(Selset As AcadSelectionSet) As Variant
Dim Ent As AcadEntity
Dim LL As Variant
Dim UR As Variant
Dim Limits(0 To 1, 0 To 2) As Double
Limits(0, 0) = -0.0000000000001
For Each Ent In Selset
    If Left$(Ent.ObjectName, 7)"AcDbDim" And Ent.ObjectName"AcDbAttributeDefinition" _
            And Ent.ObjectName"AcDBText" Then 'negeer dimensies attributen en texten
      
      Ent.GetBoundingBox LL, UR
      If Limits(0, 0) = -0.0000000000001 Then'init upperleft, lowerright
            Limits(0, 0) = LL(0): Limits(0, 1) = LL(1): Limits(0, 2) = LL(2)
            Limits(1, 0) = UR(0): Limits(1, 1) = UR(1): Limits(1, 2) = UR(2)
      Else 'get boundingbox selectionset
            If Limits(0, 0) > LL(0) Then Limits(0, 0) = LL(0)
            If Limits(0, 1) > LL(1) Then Limits(0, 1) = LL(1)
            If Limits(0, 2) > LL(2) Then Limits(0, 2) = LL(2)
            If Limits(1, 0)5 Then
      StartPtd(0) = intPointsNew(0) - 10
      StartPtd(1) = intPointsNew(1)
      StartPtd(2) = intPointsNew(2)
      EndPtD(0) = intPointsNew(3) - 10
      EndPtD(1) = intPointsNew(4)
      EndPtD(2) = intPointsNew(5)
    End If
End If
End Sub

Tuoni 发表于 2006-11-6 08:59:22


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

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

Dnereb 发表于 2006-11-6 09:32:05

问题可能在这里发生。如果减去 2 个相同的对象,则没有剩余空间来获取

Tuoni 发表于 2006-11-6 09:44:11

尽管这似乎是一个不错的解决方案,但该对象没有从中减去任何东西(如果您考虑它,我会得到一个不同的错误 - 它会失败,因为“entry”将不再存在)

Bryco 发表于 2006-11-6 09:49:26

这里的重点是你没有展示足够多的代码。我们只能猜测。据我所知,一个多边形与另一个多边形共享一些点的事实不会改变Getboundingbox的结果,它只会查看你给它的实体。

Tuoni 发表于 2006-11-6 09:53:22

我没有其他代码可以给你看,都和这个函数无关。我本以为也是这样,但是就像我说的,它一直有效,直到你接触到另一条有不止一个顶点的线。我用entry(这是一个区域)来填充它,如果entry不止一次接触折线,那么它将返回值0,0,0。我没有其他代码可以给你看。

Bryco 发表于 2006-11-6 10:10:44

Dnereb:我刚刚看到你的编辑。 谢谢,我测试了它,我也没有问题 - 虽然我不明白为什么该代码有效,而我的代码不起作用:/
页: [1] 2
查看完整版本: GetBoundingBox返回0,0,0?