vb.net autocad 2007选择集没有Items

时间:2013-12-27 18:44:04

标签: vb.net selection autocad

在OS WIn 7中使用Autocad 2007我尝试选择项目然后做东西 问题是选择集ssetObj中没有ITEMS - 不确定原因!

代码:适用于vba但不适用于独立的vb.net

Private Sub CommandButton1_Click()

Dim myapp As AcadApplication
Dim mydoc As AcadDocument
Dim ssetObj As AcadSelectionSet
Dim ent As AcadObject
Dim numVertices As Long

On Error GoTo err:


Set myapp = GetObject(, "AutoCAD.Application.17")
Set mydoc = myapp.ActiveDocument

    If mydoc.SelectionSets.Count > 0 Then
        mydoc.SelectionSets(0).Delete
    End If

Set ssetObj = mydoc.SelectionSets.Add("ss")

list1.Clear


Me.Hide

AppActivate ("Autocad")

ssetObj.SelectOnScreen:'WORKS TO SELECT

Dim numpls As Integer

numpls = ssetObj.Count:'WORKS TO GET COUNT

Dim i As Integer
For i = 0 To numpls - 1


    Set ent = ssetObj.Item(i)':PROBLEM HERE**THERE ARE NO ITEMS THOUGH COUNT IS CORRECT



    If ent.ObjectName = "AcDbLWPolyline" Or ent.ObjectName = "AcDbPolyline" Then

    numVertices = (UBound(ent.Coordinates) + 1) / 2

        list1.AddItem Str(ent.ObjectID) + "\" + Str(numVertices) + " Vertices"

    End If

Next i

Me.Show


Exit Sub

err:

MsgBox err.Description


End Sub

1 个答案:

答案 0 :(得分:1)

编辑:进一步调查显示,如果您想获得所选内容的索引项,则应调用ssetObj(i)。

如果您打算迭代它,我不会担心尝试获取选择集的计数。 A For Each应该足以走过它。从VBA / VB6转向VB.NET的一个问题是使用相同的方法的诱惑,当它有时可能是无效的(有时它可能是优秀的,但.NET非常有能力)。这是我测试你的问题的全班,只是为了展示我如何连接到AutoCAD并与之连接。

Public Class frmMain

    Private acApp As AcadApplication
    Private polyList As List(Of String)
    Const acProgId As String = "AutoCAD.Application.17"

    <DllImport("User32.dll")> _
    Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Boolean
    End Function

    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
        Try
            acApp = DirectCast(Marshal.GetActiveObject(acProgId), AcadApplication)
        Catch
            Try
                Dim acType = Type.GetTypeFromProgID(acProgId)
                acApp = DirectCast(Activator.CreateInstance(acType), AcadApplication)
            Catch ex As Exception
                MsgBox("Unable to create AutoCAD application of type: " & acProgId)
            End Try
        End Try
    End Sub

    Private Sub btnSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelect.Click
        If acApp Is Nothing Then Return
        acApp.Visible = True

        Dim acDoc As AcadDocument = acApp.ActiveDocument

        ' Kill all existing selection sets
        While (acDoc.SelectionSets.Count > 0)
            acDoc.SelectionSets(0).Delete()
        End While

        Dim mySS As AcadSelectionSet = acDoc.SelectionSets.Add("ss")
        SetForegroundWindow(acApp.HWND)

        mySS.SelectOnScreen()
        polyList = New List(Of String)
        Dim numVertices As Integer
        For Each ent As AcadEntity In mySS
            If ent.ObjectName = "AcDbLWPolyline" Or
            ent.ObjectName = "AcDbPolyline" Then
                numVertices = (ent.Coordinates.Length) / 2
                polyList.Add(String.Format("{0} \ {1} Vertices", ent.ObjectID, numVertices))
            End If
        Next

    End Sub
End Class
像这样的外部COM方法比通过VBA看到的要慢。因此,绝对值得深入研究进程中的AutoCAD .NET内容以获得出色的性能。