У меня есть два DLL-файла.Давайте назовем их:
- DoSomething01.dll
- DoSomething02.dll
Вариант использования, в котором я работаю над обеими этими DLL, описываетсяследующие шаги:
- Открыть Drawing01.dwg и Drawing02.dwg в AutoCAD.
- Загрузить DoSomething01.dll в AutoCAD с помощью NETLOAD в командной строке.
- Загрузить DoSomething02.dll в AutoCAD с помощью NETLOAD в командной строке.
- Я запускаю функцию из DoSomething01.dll из командной строки Drawing01.dwg.
- Я запускаю функцию из DoSomething02.dll изкомандная строка Drawing02.dwg.
- Нажмите что-нибудь на чертеже (как вход для функции в 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
На самом деле он ждет, пока я нажму на чертеж, прежде чем продолжить.Проблема может быть связана с активацией документа (переключением).Я действительно вижу изменения активных документов при выполнении кода, но после его переключения пользователь больше не может прерывать интерактивно (?).Или, может быть, я что-то упустил, как активировать или переключиться в Документ?