如何运行具有不同CommandFlags值的函数?

时间:2018-10-03 07:00:35

标签: vb.net autocad autocad-plugin

我有两个DLL文件。我们称它们为:

  1. DoSomething01.dll
  2. DoSomething02.dll

以下两个步骤描述了我正在这两个DLL上使用的用例:

  1. 在AutoCAD中打开Drawing01.dwg和Drawing02.dwg。
  2. 在命令行中通过NETLOAD将DoSomething01.dll加载到AutoCAD中。
  3. 在命令行中通过NETLOAD将DoSomething02.dll加载到AutoCAD中。
  4. 我从Drawing01.dwg的命令行运行DoSomething01.dll中的函数。
  5. 我从Drawing02.dwg的命令行运行DoSomething02.dll中的函数。
  6. 单击图形上的某些内容(作为DoSomething02.dll中功能的输入)。

我想做的是从一个操作中运行两个DLL的功能-本质上执行第no步。在一个新的DLL文件中的一个函数调用中,第4至6个操作。

我的新DLL文件中的代码如下:

Dim acDocDwg01 As Document
Dim acDocDwg02 As Document

<CommandMethod("DOITALL", CommandFlags.Session)>
Public Sub AllInOneFunction()
    Dim dosomething01 As New DoSomething01.clsMain
    Dim dosomething02 As New DoSomething02.clsMain

    Dim acDocMgr As DocumentCollection = Application.DocumentManager

    If isBothDrawingsOpened() Then
        ' Activate Drawing01 document
        acDocMgr.MdiActiveDocument = acDocDwg01
        dosomething01.createStuff()

        ' Activate Drawing02 document
        acDocMgr.MdiActiveDocument = acDocDwg02
        dosomething02.createMoreStuff()
    End If
End Sub

Private Function isBothDrawingsOpened() As Boolean
    Dim flag As Boolean

    'Collection of all opened documents
    Dim acadDocs As DocumentCollection = Application.DocumentManager
    Dim acDoc As Document
    Dim acCurDb As Database

    Dim d1, d2 As Boolean

    For Each acDoc In acadDocs
        acCurDb = acDoc.Database
        If acCurDb.Filename = "Drawing01" > 0 Then
            d1 = True
            acDocDwg01 = acDoc
        ElseIf acCurDb.Filename = "Drawing02" > 0 Then
            d2 = True
            acDocDwg02 = acDoc
        End If
        modLog.LogWrite(1, "Current Document: " & acDoc.Name)
    Next acDoc

    If (d1 And d2) = False Then
        MessageBox.Show("Please open both Drawing01.dwg and Drawing02.dwg before executing this function.")
        flag = False
    Else
        flag = True
    End If

    Return flag

End Function

问题是... ,因为我需要在两个文档(工程图)之间切换,所以我需要使用CommandFlags.Session。但是步骤中的功能没有。 6,使用CommandFlags.UsePickSet。我提供的代码只是通过DoSomething02.dll功能上的代码运行,而无需等待用户输入(单击)。

我从AutoDesk documentation读到:

  

您可以通过使用VB.NET中的+运算符和| |来指定使用多个标志。 C#中的运算符。

<CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet + _
                                             CommandFlags.NoBlockEditor)> _
Public Sub CheckForPickfirstSelection()
 . . .
End Sub

我尝试这样做,但是没有用。行为是相同的。

更新: 我尝试逆转操作顺序:

    If isBothDrawingsOpened() Then
        ' Activate Drawing02 document
        acDocMgr.MdiActiveDocument = acDocDwg02
        dosomething02.createMoreStuff()

        ' Activate Drawing01 document
        acDocMgr.MdiActiveDocument = acDocDwg01
        dosomething01.createStuff()
    End If

它实际上是在等我单击图纸,然后继续。该问题可能与文档激活(切换)有关。实际上,我可以看到活动文档随着代码的运行而发生变化,但是切换之后,用户将无法再以交互方式中断(?)。也许我在激活或切换到文档方面缺少什么?

1 个答案:

答案 0 :(得分:1)

不确定,但是在将acDocDwg01设置为current之后,也许可以将焦点放在图形上。  就像:Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Focus();