IntersectWith

#1
Neste código gera exceção em IntersetWith com "eInvalidInput"

Code: Select all

Public Function SelecionarVigasSemOrdenar(poly As Point3dCollection) As ObjectIdCollection
        Dim doc As Document = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Dim db As Teigha.DatabaseServices.Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim tr As Transaction = db.TransactionManager.StartTransaction()
        Dim acLock As DocumentLock = doc.LockDocument()
        Dim u As New Utilidade
        Dim ret As New ObjectIdCollection


        Try

            Dim acTypValAr(1) As TypedValue
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "MLINE"), 0)
            'acTypValAr.SetValue(New TypedValue(DxfCode.LinetypeName, Linhas.Center), 1)
            acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, Aplicativos.Grelha.Perfil), 1)

            Dim acSelFtr As New SelectionFilter(acTypValAr)


            Dim ptMin As Point3d = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.Extmin
            Dim ptMax As Point3d = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.Extmax

            Dim view As New ViewTableRecord

            Dim min2d As Point2d = New Point2d(poly(0).X, poly(0).Y)
            Dim max2d As Point2d = New Point2d(poly(1).X, poly(1).Y)

            view.CenterPoint = min2d + ((max2d - min2d) / 2.0)

            view.Height = Math.Abs(max2d.Y - min2d.Y)

            view.Width = Math.Abs(max2d.X - min2d.X)


            ed.SetCurrentView(view)

            Dim acSSPrompt As PromptSelectionResult = ed.SelectCrossingPolygon(poly, acSelFtr)

            view = New ViewTableRecord
            min2d = New Point2d(ptMin.X, ptMin.Y)
            max2d = New Point2d(ptMax.X, ptMax.Y)

            view.CenterPoint = min2d + ((max2d - min2d) / 2.0)

            view.Height = max2d.Y - min2d.Y

            view.Width = max2d.X - min2d.X

            ed.SetCurrentView(view)

            ' Show()

            If acSSPrompt.Status = PromptStatus.OK Then

#Region "novo"
                _Pts = New Point3dCollection

                Dim acLinha As New Line(poly(0), poly(poly.Count - 1))
                Dim Distancias As New DoubleCollection

                For Each obj As SelectedObject In acSSPrompt.Value
                    Dim o As ObjectId = obj.ObjectId
                    If Not o = ObjectId.Null Then

                        Dim Ent As Entity = tr.GetObject(o, Teigha.DatabaseServices.OpenMode.ForRead)

                        ret.Add(o)

                        Dim ThisGR As New IntPtr
                        Dim OtherGR As New IntPtr
                        Dim PtsLocal As New Point3dCollection
                        Try


                            acLinha.IntersectWith(Ent, Intersect.OnBothOperands, PtsLocal, ThisGR, OtherGR)
                        Catch ex As teigha.Runtime.Exception
                            MsgBox(String.Format("{0} {1} {2}", ex.Source, ex.StackTrace, ex.Message), vbCritical)
                        End Try
                        If Not IsNothing(PtsLocal) AndAlso PtsLocal.Count > 0 Then
                            Distancias.Add(poly(0).DistanceTo(PtsLocal(2)))
                            _Pts.Add(PtsLocal(2))
                        End If
                        'End If
                    End If
                Next
#End Region

                For Each p As Point3d In _Pts
                    'Distancias.Add(poly(0).DistanceTo(p))


                Next
                Dim distancia As Double = Distancias(0)



            End If


        Catch ex As System.Exception
            tr.Abort()

            MsgBox(String.Format("{0} {1} {2}", ex.Source, ex.StackTrace, ex.Message), vbCritical)
        Finally
            tr.Dispose()
            '_Pts.Dispose()
        End Try

        Return ret
    End Function

Re: IntersectWith

#2
Também testei esta alternativa sem sucesso:

Code: Select all

Public Function SelecionarVigasSemOrdenar(poly As Point3dCollection) As ObjectIdCollection
        Dim doc As Document = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument
        Dim db As Teigha.DatabaseServices.Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim tr As Transaction = db.TransactionManager.StartTransaction()
        Dim acLock As DocumentLock = doc.LockDocument()
        Dim u As New Utilidade
        Dim ret As New ObjectIdCollection

        Dim acBlkTbl As BlockTable = tr.GetObject(IntelliCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.BlockTableId, Teigha.DatabaseServices.OpenMode.ForRead)
        Dim acBlkTblRec As BlockTableRecord = tr.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), Teigha.DatabaseServices.OpenMode.ForWrite)


        Try

            Dim acTypValAr(1) As TypedValue
            acTypValAr.SetValue(New TypedValue(DxfCode.Start, "MLINE"), 0)
            'acTypValAr.SetValue(New TypedValue(DxfCode.LinetypeName, Linhas.Center), 1)
            acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, Aplicativos.Grelha.Perfil), 1)

            Dim acSelFtr As New SelectionFilter(acTypValAr)


            Dim ptMin As Point3d = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.Extmin
            Dim ptMax As Point3d = Intellicad.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.Extmax

            Dim view As New ViewTableRecord

            Dim min2d As Point2d = New Point2d(poly(0).X, poly(0).Y)
            Dim max2d As Point2d = New Point2d(poly(1).X, poly(1).Y)

            view.CenterPoint = min2d + ((max2d - min2d) / 2.0)

            view.Height = Math.Abs(max2d.Y - min2d.Y)

            view.Width = Math.Abs(max2d.X - min2d.X)


            ed.SetCurrentView(view)

            Dim acSSPrompt As PromptSelectionResult = ed.SelectCrossingPolygon(poly, acSelFtr)

            view = New ViewTableRecord
            min2d = New Point2d(ptMin.X, ptMin.Y)
            max2d = New Point2d(ptMax.X, ptMax.Y)

            view.CenterPoint = min2d + ((max2d - min2d) / 2.0)

            view.Height = max2d.Y - min2d.Y

            view.Width = max2d.X - min2d.X

            ed.SetCurrentView(view)

            ' Show()

            If acSSPrompt.Status = PromptStatus.OK Then

#Region "novo"
                _Pts = New Point3dCollection

                Dim acLinha As New Line(poly(0), poly(poly.Count - 1))
                acLinha.SetDatabaseDefaults()

                acBlkTblRec.AppendEntity(acLinha)
                tr.AddNewlyCreatedDBObject(acLinha, True)

                Dim Distancias As New DoubleCollection

                For Each obj As SelectedObject In acSSPrompt.Value
                    Dim o As ObjectId = obj.ObjectId
                    If Not o = ObjectId.Null Then

                        Dim Ent As Entity = tr.GetObject(o, Teigha.DatabaseServices.OpenMode.ForRead)

                        ret.Add(o)

                        Dim ThisGR As New IntPtr
                        Dim OtherGR As New IntPtr
                        Dim PtsLocal As New Point3dCollection
                        Try


                            acLinha.IntersectWith(Ent, Intersect.OnBothOperands, PtsLocal, IntPtr.Zero, IntPtr.Zero)
                        Catch ex As teigha.Runtime.Exception
                            MsgBox(String.Format("{0} {1} {2}", ex.Source, ex.StackTrace, ex.Message), vbCritical)
                        End Try
                        If Not IsNothing(PtsLocal) AndAlso PtsLocal.Count > 0 Then
                            Distancias.Add(poly(0).DistanceTo(PtsLocal(2)))
                            _Pts.Add(PtsLocal(2))
                        End If
                        'End If
                    End If
                Next
#End Region

                For Each p As Point3d In _Pts
                    'Distancias.Add(poly(0).DistanceTo(p))


                Next
                Dim distancia As Double = Distancias(0)



            End If


        Catch ex As System.Exception
            tr.Abort()

            MsgBox(String.Format("{0} {1} {2}", ex.Source, ex.StackTrace, ex.Message), vbCritical)
        Finally
            tr.Dispose()
            '_Pts.Dispose()
        End Try

        Return ret
    End Function