如何使用不同的 CommandFlags 值 运行 函数?
How do I run functions with different CommandFlags value?
我有两个 DLL 文件。我们称他们为:
- DoSomething01.dll
- DoSomething02.dll
我正在处理这两个 DLL 的用例由以下步骤描述:
- 在 AutoCAD 中打开 Drawing01.dwg 和 Drawing02.dwg。
- 在命令行中通过 NETLOAD 将 DoSomething01.dll 加载到 AutoCAD。
- 在命令行中通过 NETLOAD 将 DoSomething02.dll 加载到 AutoCAD。
- I 运行 来自 DoSomething01.dll 的函数来自 Drawing01.dwg 的命令行。
- I 运行 来自 DoSomething02.dll 的函数来自 Drawing02.dwg 的命令行。
- 单击绘图上的某些内容(作为 DoSomething02.dll 上函数的输入)。
我想做的是 运行 来自一个操作的两个 DLL 的功能——本质上是执行第 1 步。在一个新的 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
。我提供的代码只是运行s通过DoSomething02.dll功能上的代码,无需等待用户输入(点击)。
我从 AutoDesk documentation 那里读到:
You can specify the use of more than one flag by using the + operator in VB.NET and the | operator in 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
它实际上是在等待我在继续之前点击绘图。该问题可能与文档激活(切换)有关。我实际上可以看到活动文档随着代码 运行s 的变化而变化,但是在切换之后,用户不能再交互中断(?)。或者我是否遗漏了如何激活或切换到文档的内容?
不确定,但也许您可以在将 acDocDwg01 设置为当前后强制将焦点放在绘图上。
喜欢:Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Focus();
我有两个 DLL 文件。我们称他们为:
- DoSomething01.dll
- DoSomething02.dll
我正在处理这两个 DLL 的用例由以下步骤描述:
- 在 AutoCAD 中打开 Drawing01.dwg 和 Drawing02.dwg。
- 在命令行中通过 NETLOAD 将 DoSomething01.dll 加载到 AutoCAD。
- 在命令行中通过 NETLOAD 将 DoSomething02.dll 加载到 AutoCAD。
- I 运行 来自 DoSomething01.dll 的函数来自 Drawing01.dwg 的命令行。
- I 运行 来自 DoSomething02.dll 的函数来自 Drawing02.dwg 的命令行。
- 单击绘图上的某些内容(作为 DoSomething02.dll 上函数的输入)。
我想做的是 运行 来自一个操作的两个 DLL 的功能——本质上是执行第 1 步。在一个新的 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
。我提供的代码只是运行s通过DoSomething02.dll功能上的代码,无需等待用户输入(点击)。
我从 AutoDesk documentation 那里读到:
You can specify the use of more than one flag by using the + operator in VB.NET and the | operator in 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
它实际上是在等待我在继续之前点击绘图。该问题可能与文档激活(切换)有关。我实际上可以看到活动文档随着代码 运行s 的变化而变化,但是在切换之后,用户不能再交互中断(?)。或者我是否遗漏了如何激活或切换到文档的内容?
不确定,但也许您可以在将 acDocDwg01 设置为当前后强制将焦点放在绘图上。 喜欢:Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Focus();