乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 151|回复: 13

[编程交流] 从VB启动AutoCAD。NET Pro

[复制链接]

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 22:28:27 | 显示全部楼层 |阅读模式
我有一个很好的方法从Excel VBA程序启动AutoCAD,但现在我们要转向VB。NET应用程序。VBA的代码是否适用于VB。网络?
 
我通常发现代码交换不太好。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:35:41 | 显示全部楼层
VBA VB。净额
 
如果没有当前实例(即进程)可供您访问,可以考虑使用Shell打开特定的应用程序图标(其中已经包括适用的启动开关)。不久前,我在一个Excel应用程序中为您提供了一个示例,该应用程序将“获取或创建”。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 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行代码来完成同样的事情。以及命名空间要求。。。。每次我发现一些声称有效的东西,海报都没有包括进口声明。。。正如您所知,这使得其余的代码变得无用。。。直到我熟悉了所有的骚扰。我一直在寻求很多建议。如果有人想争论这一点,我很乐意向大家展示,关于这个主题的现有文档是多么缺乏。我每天晚上都会读几十篇文章,这些文章都缺少必要的要点,有各种各样的拼写错误,而且毫无用处,因为作者认为任何阅读它的人都像他们一样了解它。
 
对不起,你的咆哮。。。!我非常感谢大家在这些论坛上的帮助。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 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)有助于完成添加某些引用程序集、启用调试等许多重复任务。。
 
我知道你这样做是为了工作,但你的信息(和代码)越好在前面,我或其他人就越容易帮助你。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 22:47:48 | 显示全部楼层
我把这个过程浓缩为:
 
  1. Imports Autodesk.AutoCAD.Interop.AcadDocumentClass
  2. Imports Autodesk.AutoCAD.InterOp.Common
  3. Module Module1
  4.    Sub Main()
  5.        Dim vAcadApp As Autodesk.AutoCAD.Interop.AcadApplication
  6.        Dim vAcadDoc As Autodesk.AutoCAD.Interop.AcadDocuments
  7.        vAcadApp = New Autodesk.AutoCAD.Interop.AcadApplication
  8.        vAcadApp.Visible = True
  9.       
  10.    End Sub
  11. End Module

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

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:55:33 | 显示全部楼层
很抱歉再问一次,但你能澄清一下吗。。。单机EXE(AutoCAD之外),或。NET插件(AutoCAD内部,get的NETLOADed)。。。?
 
此外,如果您可以链接(或发布)Fixo的代码,这也会很有帮助。。。只是想更好地了解你的过去和现在。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 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席位。
 
至于进口,我注意到有时。。。。有时,错误消息将显示要导入的内容或对其提出建议。但在许多情况下,只有一个错误是“不行”,我一直在寻找另一种方法。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 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代码。它实际上是一个表单,但我正在开发一个用户输入较少的流程,所以我将其改为控制台应用程序。
 
  1. Imports System.Runtime.InteropServices
  2. Imports System.Reflection
  3. Imports System.Globalization
  4. Imports System.Collections
  5. Public Class ReflectionCommands
  6.    <System.Security.SuppressUnmanagedCodeSecurity()> _
  7.    Public Shared Sub TestACAD(ByVal dwgname As String)
  8.        'Save current culture to variable
  9.        Dim thisThread As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
  10.        'Set culture to whatever you want
  11.        thisThread = New System.Globalization.CultureInfo("en-US")
  12.        Dim appProgID As String = "AutoCAD.Application"
  13.        Dim filename As String = dwgname
  14.        'NGet reference on intergrace IDispatch
  15.        Dim AcadType As Type = Type.GetTypeFromProgID(appProgID)
  16.        'Launch AutoCAD
  17.        Dim AcadApp As Object = Activator.CreateInstance(AcadType)
  18.        Dim visargs() As Object = New Object(0) {}
  19.        visargs(0) = True
  20.        'Set Application Window visible
  21.        AcadApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, Nothing, AcadApp, visargs, Nothing)
  22.        Dim AcadDocs As Object = AcadApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, Nothing, AcadApp, Nothing)
  23.        'Create array of parameters
  24.        Dim args() As Object = New Object(1) {}
  25.        args(0) = filename
  26.        args(1) = False ' read-only=false
  27.        'open a drawing
  28.        Dim AcDoc As Object = AcadDocs.GetType.InvokeMember("Open", BindingFlags.InvokeMethod, Nothing, AcadDocs, args, Nothing)
  29.        Dim Util As Object = New Object
  30.        Try
  31.            'Get reference on active document
  32.            AcDoc = AcadApp.GetType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing)
  33.            'Get reference on AcadUtility
  34.            Util = AcDoc.GetType().InvokeMember("Utility", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
  35.            'Get reference on ModelSpace
  36.            Dim oSpace As Object = AcDoc.GetType.InvokeMember("ModelSpace", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
  37.        Catch ex As Exception
  38.        End Try
  39.    End Sub
  40. End Class
  41. Module Module1
  42.    Sub Main()
  43.        Dim fname As String = "H:\Test123.dwg"
  44.        ReflectionCommands.TestACAD(fname)
  45.    End Sub
  46. End Module
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 23:08:47 | 显示全部楼层
伦德曼,
 
冒着让这篇文章对大多数人来说太长太无聊的风险,这里是我昨晚完成的一些事情。再一次,我的新手身份。NET很清楚,但我正在尝试使用此代码的较短版本。
 
  1. 3

 
好的,我不得不将关键字AcadDocuments更改为AcadDocument。。。这似乎修复了异常错误。现在可以了,它最大化了窗口。我只需要加载并执行LISP程序。
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-6 23:11:22 | 显示全部楼层
成功的甜味。或者至少这该死的东西现在起作用了。
 
SendCommandToExecute方法不起作用,或者可能需要另一个导入。我将对此进行更多研究,因为我从AutoDesk论坛获得的初始信息表示,不建议将SendCommand用于VB。净额。这很可能是真的,但我发现许多其他文章说没有问题。
 
无论如何,这是代码,它现在打开Autocad,打开模板图形,加载lisp并执行它,然后poof。。。。这是我请求的程序集dr
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 11:40 , Processed in 0.858706 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表