Bill Tillman 发表于 2022-7-6 22:28:27

从VB启动AutoCAD。NET Pro

我有一个很好的方法从Excel VBA程序启动AutoCAD,但现在我们要转向VB。NET应用程序。VBA的代码是否适用于VB。网络?
 
我通常发现代码交换不太好。

BlackBox 发表于 2022-7-6 22:35:41

VBA VB。净额
 
如果没有当前实例(即进程)可供您访问,可以考虑使用Shell打开特定的应用程序图标(其中已经包括适用的启动开关)。不久前,我在一个Excel应用程序中为您提供了一个示例,该应用程序将“获取或创建”。

Bill Tillman 发表于 2022-7-6 22:42:16

伦德曼,
 
是的,我记得很好,我用了一段时间,然而,这里的几个it人员告诉我,使用VBA程序中的Shell是不可取的。。。至少是他们。正如我在很久以前使用BASIC编程时所回忆的那样,shell命令虽然有用,但仍保留了原始代码的控制权。如果应用程序出现问题,则很难跟踪,等等。。。我知道从那时起事情已经有了很大的发展,但我一直远离Shell命令,主要是因为这个原因。
 
我目前使用的VBA方法是这样的,您会注意到它允许我输入所需的参数来启动正确的LISP程序并执行它:
 
我在找VB。NET compatible和我们的好朋友Fixo在另一个论坛上发布了一条帖子,我对此进行了修改。它工作得很好,但它在一个小窗口中打开AutoCAD,而不是最大化,这正是我想要的。
 
现在,我想补充一点。我一直在学习VB。NET因为这里的IT人员告诉我这是。或高速公路。我不制定规则,我只是遵守规则。他们希望我尽快让工程部门摆脱VBA。没问题,我喜欢挑战,到目前为止,我们已经取得了一些不错的进展,但当我看到Fixo从VB启动AutoCAD的代码时。NET很难理解如何从头开始编程。很久以前,有了BASICA和QBASIC,从头开始构建新的、令人兴奋的东西并不难。但是这个类的代码块有24行长,其中有一米长的字符串。我正在使用的VB 2010 Express中的IDE使输入内容变得很容易,但首先要尝试找到谁会想到这段代码,这是一个挑战。就像我今天早上给别人看的那样,我过去常常打开一个文件,只需要3到4行代码就可以阅读几行文本。使用VB。NET现在需要大约12或15行代码来完成同样的事情。以及命名空间要求。。。。每次我发现一些声称有效的东西,海报都没有包括进口声明。。。正如您所知,这使得其余的代码变得无用。。。直到我熟悉了所有的骚扰。我一直在寻求很多建议。如果有人想争论这一点,我很乐意向大家展示,关于这个主题的现有文档是多么缺乏。我每天晚上都会读几十篇文章,这些文章都缺少必要的要点,有各种各样的拼写错误,而且毫无用处,因为作者认为任何阅读它的人都像他们一样了解它。
 
对不起,你的咆哮。。。!我非常感谢大家在这些论坛上的帮助。

BlackBox 发表于 2022-7-6 22:43:09

我自己不是全职的专业开发人员,但我认为我们谈论的是关于Shell的两件不同的事情。。。您特别提到了Shell命令,我建议您考虑合并Shell。应用程序对象(即Windows Shell?)进入你的VB。NET应用程序启动AutoCAD(在AutoCAD之外,即从独立的EXE)。
 
VB。NET示例(Excel的示例)首先检查Excel实例(读取:一个进程),如果存在,则“获取”Excel应用程序对象,否则,如果不存在Excel实例(读取:一个进程),则会创建一个新实例。
 
遵循此概念,您可以(同样,从AutoCAD之外的独立应用程序)检查AutoCAD(Process)的活动实例,如果不存在,则使用Shell。要使用指定的应用程序图标(读取:快捷方式或.LNK)启动AutoCAD的应用程序对象,该图标将包括适用的配置文件开关(/p)等。。
 
... 这会使(更多?)你现在感觉到了吗?
 
请澄清,您是在AutoCAD内部还是外部执行此任务?OP提到“启动AutoCAD”,但最后一个示例不明确,但建议在AutoCAD中使用SendCommand。不太确定。
 
至于代码量。NET与LISP、VBA等的比较。。。相信我,我知道。。。但是,如果您想使用更高级别、全面的开发环境,这就是它的方式。
 
至于丢失的导入。。。你说你正在使用Visual Studio 2010 Express,对吗?因此,将代码粘贴到一个空白类(例如,*.vb、*.cs或其他)中,并悬停错误,选择出现的向下箭头,查看有哪些选项可用。通常(如果您引用了必要的程序集),您会看到一个选项,可以向类中添加必要的“Imports”(VB)或“using”(C#)语句。
 
.NET开发需要比LISP或VBA开发人员更高的知识水平;这只是一个事实。您应该为您的版本安装所有必要的ObjectARX SDK,并且使用向导(同样是因为您使用的是Express)有助于完成添加某些引用程序集、启用调试等许多重复任务。。
 
我知道你这样做是为了工作,但你的信息(和代码)越好在前面,我或其他人就越容易帮助你。

Bill Tillman 发表于 2022-7-6 22:47:48

我把这个过程浓缩为:
 

Imports Autodesk.AutoCAD.Interop.AcadDocumentClass
Imports Autodesk.AutoCAD.InterOp.Common

Module Module1

   Sub Main()
       Dim vAcadApp As Autodesk.AutoCAD.Interop.AcadApplication
       Dim vAcadDoc As Autodesk.AutoCAD.Interop.AcadDocuments
       vAcadApp = New Autodesk.AutoCAD.Interop.AcadApplication
       vAcadApp.Visible = True
      
   End Sub

End Module

 
这就是我要说的。几行代码来完成其他24行所做的工作。问题是它在一个小而窄的窗口中打开了AutoCAD。您认为通过添加一些附加信息来打开模板文件,然后启动一个LISP程序,这样做有效吗?

BlackBox 发表于 2022-7-6 22:55:33

很抱歉再问一次,但你能澄清一下吗。。。单机EXE(AutoCAD之外),或。NET插件(AutoCAD内部,get的NETLOADed)。。。?
 
此外,如果您可以链接(或发布)Fixo的代码,这也会很有帮助。。。只是想更好地了解你的过去和现在。

Bill Tillman 发表于 2022-7-6 22:59:21

伦德曼,
 
是的,先生。我看到了另一个帖子,我非常同意。我是一名全职开发人员。为什么?因为他们在这附近找不到任何愚蠢的人来接手。但正如我所说,我确实喜欢挑战。我并不是说我对SHELL命令的问题了如指掌,我只知道这里的IT人员给了我什么建议,我不想在一次会议上被发现我的fly open,因为他们警告我的某些事情导致了网络问题。
 
我正在编写的所有VBA代码都是从Excel电子表格中执行的。和VB。我正在开发的NET代码当然是独立的。只有我准备的LISP代码在AutoCAD中运行。我使用的send命令位于从Excel文件运行的VBA代码中。这一切都很好。但我正在研究的新过程将不是VBA。将使用相同的LISP程序,但我们正在从VBA转移到VB。净额。
 
我使用VB 2010 Express。。。不是Visual Studio。据称这是一个淡化版本的VS,只包含VB。NET语言。它是免费的。。。这就是我向他们推销的东西。其他人建议我,Express版本有很多功能可以实现我想要的功能。。。到目前为止,这似乎取决于任务。如果到时候不会,那么我将有一些弹药来申请Visual Studio的预算。。。虽然他们在这里确实有几个座位。问题是2005年也可能是1985年,因为。此处所需的NET代码不兼容。我必须小心我的购买请求,尤其是现在,因为他们刚刚为Acad 2013购买了新的许可证。。。并将其记入我的部门。在我向他们展示投资回报率之前,很难要求一个新的VS席位。
 
至于进口,我注意到有时。。。。有时,错误消息将显示要导入的内容或对其提出建议。但在许多情况下,只有一个错误是“不行”,我一直在寻找另一种方法。

Bill Tillman 发表于 2022-7-6 23:04:46

这是我从Fixo找到的代码的链接。在第12页的下方。菲索在这方面真的很在行,过去他帮了很大的忙。我给他发了一个PM,里面有我修改过的代码,看看他是否有时间帮忙。代码可以工作,它实际上会打开一个现有的图形,这是我最终要做的,就像我现在使用的VBA代码一样。它还可以在一个非常高和窄的窗口中打开AutoCAD,而不是最大化。此外,我需要加载和执行LISP程序。
 
http://www.dreamincode.net/forums/topic/244731-how-to-connect-to-autocad-and-open-a-drawing/
 
这是我修改过的Fixo代码。它实际上是一个表单,但我正在开发一个用户输入较少的流程,所以我将其改为控制台应用程序。
 

Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.Globalization
Imports System.Collections

Public Class ReflectionCommands

   <System.Security.SuppressUnmanagedCodeSecurity()> _
   Public Shared Sub TestACAD(ByVal dwgname As String)
       'Save current culture to variable
       Dim thisThread As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
       'Set culture to whatever you want
       thisThread = New System.Globalization.CultureInfo("en-US")
       Dim appProgID As String = "AutoCAD.Application"
       Dim filename As String = dwgname
       'NGet reference on intergrace IDispatch
       Dim AcadType As Type = Type.GetTypeFromProgID(appProgID)

       'Launch AutoCAD
       Dim AcadApp As Object = Activator.CreateInstance(AcadType)
       Dim visargs() As Object = New Object(0) {}
       visargs(0) = True
       'Set Application Window visible
       AcadApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, Nothing, AcadApp, visargs, Nothing)
       Dim AcadDocs As Object = AcadApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, Nothing, AcadApp, Nothing)

       'Create array of parameters
       Dim args() As Object = New Object(1) {}
       args(0) = filename
       args(1) = False ' read-only=false
       'open a drawing
       Dim AcDoc As Object = AcadDocs.GetType.InvokeMember("Open", BindingFlags.InvokeMethod, Nothing, AcadDocs, args, Nothing)
       Dim Util As Object = New Object
       Try
         'Get reference on active document
         AcDoc = AcadApp.GetType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing)
         'Get reference on AcadUtility
         Util = AcDoc.GetType().InvokeMember("Utility", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
         'Get reference on ModelSpace
         Dim oSpace As Object = AcDoc.GetType.InvokeMember("ModelSpace", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)

       Catch ex As Exception

       End Try

   End Sub
End Class
Module Module1

   Sub Main()
       Dim fname As String = "H:\Test123.dwg"
       ReflectionCommands.TestACAD(fname)
   End Sub

End Module

Bill Tillman 发表于 2022-7-6 23:08:47

伦德曼,
 
冒着让这篇文章对大多数人来说太长太无聊的风险,这里是我昨晚完成的一些事情。再一次,我的新手身份。NET很清楚,但我正在尝试使用此代码的较短版本。
 
3
 
好的,我不得不将关键字AcadDocuments更改为AcadDocument。。。这似乎修复了异常错误。现在可以了,它最大化了窗口。我只需要加载并执行LISP程序。

Bill Tillman 发表于 2022-7-6 23:11:22

成功的甜味。或者至少这该死的东西现在起作用了。
 
SendCommandToExecute方法不起作用,或者可能需要另一个导入。我将对此进行更多研究,因为我从AutoDesk论坛获得的初始信息表示,不建议将SendCommand用于VB。净额。这很可能是真的,但我发现许多其他文章说没有问题。
 
无论如何,这是代码,它现在打开Autocad,打开模板图形,加载lisp并执行它,然后poof。。。。这是我请求的程序集dr
页: [1] 2
查看完整版本: 从VB启动AutoCAD。NET Pro