Как запустить функции с разными значениями CommandFlags? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть два DLL-файла.Давайте назовем их:

  1. DoSomething01.dll
  2. DoSomething02.dll

Вариант использования, в котором я работаю над обеими этими DLL, описываетсяследующие шаги:

  1. Открыть Drawing01.dwg и Drawing02.dwg в ​​AutoCAD.
  2. Загрузить DoSomething01.dll в AutoCAD с помощью NETLOAD в командной строке.
  3. Загрузить DoSomething02.dll в AutoCAD с помощью NETLOAD в командной строке.
  4. Я запускаю функцию из DoSomething01.dll из командной строки Drawing01.dwg.
  5. Я запускаю функцию из DoSomething02.dll изкомандная строка Drawing02.dwg.
  6. Нажмите что-нибудь на чертеже (как вход для функции в DoSomething02.dll).

Я пытаюсь запустить функциииз двух DLL из одной операции - по существу выполнение шагов нет.4-6 в одном вызове функции в новом DLL-файле.

Код в моем новом 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 , что:

Вы можете указать использование более одного флага, используя оператор + в 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 голосов
/ 10 октября 2018

Не уверен, но, возможно, вы могли бы навести фокус на чертеж после установки тока acDocDwg01.Например: Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Focus ();

...