vb.net autocad 2007选择集没有任何项

vb.net autocad 2007选择集没有任何项,vb.net,selection,autocad,Vb.net,Selection,Autocad,在使用Autocad 2007的OS WIn 7中,我尝试选择项目,然后执行操作 问题是选择集中没有项目ssetObj-不知道为什么 代码:在vba中工作,但不是独立的vb.net Private Sub CommandButton1_Click() Dim myapp As AcadApplication Dim mydoc As AcadDocument Dim ssetObj As AcadSelectionSet Dim ent As AcadObject Dim numVertice

在使用Autocad 2007的OS WIn 7中,我尝试选择项目,然后执行操作 问题是选择集中没有项目ssetObj-不知道为什么

代码:在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

编辑:进一步的调查表明,如果要获取选择集的索引项,应该调用ssetObj(i)

如果您打算迭代选择集,我不必担心如何获取选择集的计数。每个人都有一份工作,就足够走过去了。从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
公共类frmMain
作为AcadApplication的私有acApp
私有多段列表作为列表(字符串)
Const acProgId As String=“AutoCAD.Application.17”
_
私有共享函数SetForegroundWindow(ByVal hWnd作为IntPtr)作为布尔值
端函数
私有子btnStart_Click(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理btnStart。单击
尝试
acApp=DirectCast(Marshal.GetActiveObject(acProgId),AcadApplication)
抓住
尝试
Dim acType=Type.GetTypeFromProgID(acProgId)
acApp=DirectCast(Activator.CreateInstance(acType),AcadApplication)
特例
MsgBox(“无法创建类型为:&acProgId的AutoCAD应用程序”)
结束尝试
结束尝试
端接头
Private Sub btselect_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btselect。单击
如果acApp为空,则返回
acApp.Visible=True
Dim acDoc As AcadDocument=acApp.ActiveDocument
'杀死所有现有选择集
而(acDoc.SelectionSets.Count>0)
acDoc.SelectionSets(0).Delete()
结束时
将mySS作为AcadSelectionSet=acDoc.SelectionSets.Add(“ss”)进行调整
SetForegroundWindow(acApp.HWND)
mySS.SelectOnScreen()
polyList=新列表(字符串)
作为整数的Dim NUM属性
对于每个在mySS中作为身份的ent
如果ent.ObjectName=“AcDbLWPolyline”或
ent.ObjectName=“AcDbPolyline”然后
numVertices=(ent.Coordinates.Length)/2
polyList.Add(String.Format(“{0}\{1}顶点”,ent.ObjectID,numVertices))
如果结束
下一个
端接头
末级

像这样的外部COM方法将比您习惯于通过VBA看到的要慢。因此,深入研究正在进行的AutoCAD.NET内容以获得出色的性能绝对值得。

请描述具体发生的情况,以及这与您预期的不同之处。有例外吗?如果是这样,请复制并粘贴异常信息。@Locke,在鼓励精确描述的技术网站上,诸如“不工作”和“未正确索引”之类的短语是没有位置的。如果你对这个问题的描述比OP所能表达的更精确,那么请更正这篇文章,而不是嘲笑我指出它的不足。@Owenengard,我真的很难理解为什么这是一个如此困难的问题。我同意您对上一个AutoCAD问题所作的评估,但是您在查看OP的问题时显然没有表现出自己的努力。“索引不正确”实际上是一个愚蠢的好主意。@OwenWengerd堆栈上每天都会出现很多可怕的问题,这一个也没那么糟糕。OP张贴了他的作品,指出了它的破绽之处,并用通俗易懂的英语解释了他想做什么。如果所有的问题至少都是这么好的话,我们就更好了。将全新用户(表现出努力的用户)保持在自己的技术开发知识水平不仅是精英主义的,而且是愚蠢的。@Locke,你有权发表你的意见,但我不同意,我认为OP的意见比你或我的意见更重要。我不认为高标准是精英主义。我认为花点时间向新(和老)用户解释他们如何获得更快更好的响应是很有帮助的。在这种情况下,不是“理解问题”,而是“理解问题”。这个问题没有得到清楚的解释,所以只能让响应者猜测。这对猜测者或OP没有帮助。运行示例代码时出现以下错误:“来自HRESULT的异常:0x8002802B(TYPE_E_ELEMENTNOTFOUND)”。我使用COM的;Autocad 2007类型库和Autodesk.Autocad.interop.common.dll作为参考。我没有收到任何警告-只是在屏幕上成功选择实体后在selectionset中找不到项目。这里应该使用什么参考资料?这些是正确的参考资料。然而,与未来版本相比,2007的功能可能并不有限。在代码中,如何将选择集视为对象集合?(ssetObj(i))添加:ssobjColl=mydoc.SelectionSets;并正确获得了选择集的计数,但没有“项”方法。我使用的是VisualBasic2010Express和Win7-除了获取选择集项之外,其他项目中的一切都可以使用。我可以与Autocad通信,但无法创建显示项目以进行循环的选择集。我担心类型库没有注册,但我没有收到任何警告。我检查了已注册的Dll,但没有看到已注册的Dll,但如果我能抓取Autocad,则Dll必须正常工作-我想。-帮助。类型库肯定已注册。这些项目直接在类下编制索引,而不是像VBA那样放入项目子列表中。通过在VisualStudio中启动ObjectBrowser并查看