patelankitm 发表于 2022-7-6 07:02:16

我试图运行这段代码,并得到“错误绑定到方法”我正在运行AutoCAD Architecture 2014。
 

       <CommandMethod("SMB", CommandFlags.Session)> _
       Public Sub SMB(ByVal DwgName As String)
         ' LAUNCH AUTOCAD & LISP
         'Sub Launch_AutoCAD(ByVal DwgName As String)

         Dim vAcadApp As AcadApplication
         Dim vAcadDoc As AcadDocument


         Dim DwgPath As String = "\\\.....

         Dim LispPath As String = ".....

         Dim My_Lisp As String = "SMBTEST"

         Dim Cmd_To_Start_LISP_Program As String = "SMBRUN"


         Try
               If Process.GetProcessesByName("acad").Length > 0 Then
                   vAcadApp = GetObject(, "AutoCAD.Application")
               Else
                   'vAcadApp = CreateObject("AutoCAD.Application.20")
                   vAcadApp = New AcadApplication
               End If

               vAcadApp.Visible = True
               vAcadApp.WindowState = AcWindowState.acMax
               vAcadDoc = vAcadApp.Documents.Open(DwgPath & DwgName, True)
               vAcadDoc.SendCommand("(load """ & LispPath & My_Lisp & ".lsp"" ""The load failed"") " & Cmd_To_Start_LISP_Program & Chr(13))
         Catch ex As System.Exception

         Finally
               vAcadApp = Nothing
               vAcadDoc = Nothing

         End Try
       End Sub














BlackBox 发表于 2022-7-6 07:03:25

 
您已经编写了一个CommandMethod方法(一个插件),该方法试图从流程中访问应用程序对象(通常通过COM从独立应用程序中完成),而您可以只从Autodesk获取应用程序对象。AutoCAD。应用程序服务。应用
 
HTH公司

Bill Tillman 发表于 2022-7-6 07:09:51

是的,黑盒子说的。。。。但对于我们这些新手和新手来说,理解这些行话和流行语通常很难。基本上,他说的是我提供给你的代码是作为一个独立的程序运行的,或者叫做COM方法。
 
代码中的第一行是从另一端接近它的,也就是说,您正在尝试编写要在AutoCAD环境本身内部运行的代码。也许在座的其他更有经验的人可以为我们详细阐述这一点。我通常使用COM方法编程,但其他人更喜欢应用程序方法。如果您试图在AutoCAD已经运行打开的图形时运行此功能,则需要查看与我提供的不同的内容。我发布的方法基本上适用于闲置的机器,或者只打开AutoCAD而没有加载图形文件。编译的exe程序在AutoCAD不知道的情况下运行,直到从编译的exe调用它。我所做的自动编码不适合应用程序方法,因此我从AutoCAD之外运行所有内容。
 
我希望我没有把那里的水弄得太浑。我决不能声称自己是这方面的专家。

patelankitm 发表于 2022-7-6 07:12:16

不过,我通过大量试验得出了这个结论。我现在已经通过COM创建了一个独立的应用程序。我可以启动AutoCAD,但当我发送命令时,我得到“加载失败”
你能指出我的代码有什么问题吗?
 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


       Const progID As String = "AutoCAD.Application.19.1"
       Dim acApp As AcadApplication = Nothing

       Dim LispPath As String = "..."

       Dim My_Lisp As String = "SMBTEST"

       Dim Cmd_To_Start_LISP_Program As String = "SMBRUN"

       Try
         acApp = DirectCast(Marshal.GetActiveObject(progID), AcadApplication)
       Catch
         Try
               Dim acType As Type = Type.GetTypeFromProgID(progID)
               acApp = DirectCast(Activator.CreateInstance(acType, True), AcadApplication)
         Catch
               MessageBox.Show("Cannot create object of type """ + progID + """")
         End Try
       End Try
       If acApp IsNot Nothing Then
         acApp.Visible = True
         acApp.ActiveDocument.SendCommand("(load """ & LispPath & My_Lisp & ".lsp"" ""The load failed"") " & Cmd_To_Start_LISP_Program & Chr(13))
       End If
   End Sub

BlackBox 发表于 2022-7-6 07:17:21

我不确定我可以用什么行话或流行语。。。我说的很直接。如果其他成员不知道两者之间的区别。NET和COM接口;这很好,但我自己从来没有编写过COM应用程序(除非你计算Visual LISP,我没有),我宁愿认为自己是这方面的初学者。NET API。
 
我知道的很少,我可能知道得很清楚,但这很难表明我是一名专家(我不是)。。。信不信由你,我其实是想帮上忙。
 
干杯
页: 1 [2]
查看完整版本: 从C++代码运行Lisp