找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8916|回复: 14

[飞鸟集] [原创]AutoCAD的三大程序语言(ARX,LISP,VBA)的连接

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 22:14:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Highflybird 于 2013-5-7 22:16 编辑


定制自己的ActiveX ,实现ARX和LISP,VBA的三方通信

ActiveX技术是微软组件化开发技术的基础,AutoCAD本身就是一个ActiveX自动化服务器,它提供了一系列的activeX对象.通过这些对象的属性和方法,VBA,VisualLisp就能控制autoCAD程序。
因此我们如果在开发的OjbectARX程序中实现ActiveX自动化,就可以实现Vlisp,VBA和ARX的三方的互相通信。在某些情况下,可以为我们带来很多便利。
譬如我们的核心数据处理(数值计算,等等)由arx开发,其他容易的代码则由vlisp或者VBA实现,这样我们可以达到高效和易用性的统一。
Vlisp和VBA可以调用arx定义的类和函数,并可以得到返回值,甚至可以调用其对话框资源,等等。
下面我抛砖引玉,通过这样的一个教程,演示如何实现这样的三方通信。
这个教程的大致流程如下: 由visual C++ 开发一个MFC DLL,并在其中建立一个类,定义了两个简单的函数,生成以供lisp和VBA调用。
首先创建一个MFC DLL工程,工程名为:MyActTest:

Create MFC DLL.jpg

在用向导方式创建的这步,勾选自动化(Automation)

MFC DLL Wizard.jpg

完成文件的创建之后,记得把arx工程所需要的库文件和包含文件加入进来。
并在stdafx.h文件的末尾添加如下头文件:
#include "arxHeaders.h"  // 为objectARX应用添加
然后用向导方式创建一个MFC类。

Add Class Wizard.jpg

这个类的名字叫CActTest,基类为CCmdTarget,在自动化(automation)中勾选可按类型ID创建(Createable by type ID)
然后按OK.

Add Class.jpg

为这个类添加你自己定制的成员函数。我在这里定义了两个简单的函数,一个函数用对话框弹出你需要的文字(就像 Hello,world那样),另外的一个则是返回一个整数的平方。

Add member Function.jpg

这样函数申明和定义完成后,不要忘记在类实现文件(ActTest.cpp)中的这段中添加函数的引用。(//那一行处为添加部分)
如:showStr,MySquare。
BEGIN_DISPATCH_MAP(CActTest, CCmdTarget)
DISP_FUNCTION(CActTest, "ShowStr", ShowStr, VT_EMPTY, VTS_BSTR)     //函数ShowStr的调用及其参数
DISP_FUNCTION(CActTest, "MySquare", MySquare, VT_I4, VTS_I4)  //函数MySquare的调用及其参数
END_DISPATCH_MAP()
然后编译它,生成DLL文件,以供调用.
VLisp中的调用:
[pcode=lisp,true]
;;; 本程序演示了如何通过Activex来调用arx中的类(class)和函数。
;;; 程序先注册ActiveX,后创建一个object,用vlax-invoke-method
;;; 来调用其中的函数的功能,也可以通过它得到返回值。
;;; 程序未加出错判断,请自行加入。
;;; highflybird      2009-5-23 Haikou
(vl-load-com)
(defun c:test (/ obj)
  (DllRegister "F:\\ZQY\\MyProject\\MyActTest\\Debug\\MyActTest.DLL")   ; 也可以增加判断,如果注册了则无需再注册
  (setq obj (vlax-create-object "MyActTest.ActTest"))   ; 创建一个实例(对象)
  (vlax-invoke-method obj 'ShowStr "highflybird")   ; 调用其MyActTest中的函数
  (print (vlax-invoke-method obj 'MySquare 12))    ; 得到返回值
  (vlax-release-object obj)      ; 别忘记释放实例
  (UnDllRegister "F:\\ZQY\\MyProject\\MyActivex\\Debug\\MyActTest.DLL") ; 反注册
  (princ)
)
;;; DLL 的注册
(defun DLLRegister (dll)
  (startapp "regsvr32.exe" (strcat "/s \"" dll "\""))
)
;;; DLL 的反注册
(defun UnDLLRegister (dll)
  (startapp "regsvr32.exe" (strcat "/u /s \"" dll "\""))
)
[/pcode]VBA中的调用:
打开VBA编辑器,选择菜单的工具--引用,弹出对话框,点击浏览,选择你生成的DLL文件的目录,找到它,打开它并按下引用对话框的确定,
这样我们就可以再VBA中引用自己定义的ActiveX了.

Active Ref.jpg

Accept Active Ref.jpg

定义一个过程,在编辑器中输入代码:
Sub test()
    Dim obj As ActTest
    Set obj = New ActTest
    obj.ShowStr "hello,highflybird!"
    Set obj = Nothing
End Sub

运行,就看到你出现的效果了。
本程序由Visual Studio 2002 + ObjectARX2006 + AutoCAD 2006开发,在AutoCAD2006中运行通过。
如果有什么问题,请看我下面的程序包。

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:MyActTest.rar 
下载次数:30  文件大小:40.84 KB  售价:5D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]



顺便说一句,感觉到此类话题属于objectARX编程类,如有必要,请总版主移至其相应版块。


评分

参与人数 2D豆 +10 贡献 +2 收起 理由
xshrimp + 5 + 1 很给力!经验;技术要点;资料分享奖!
炫翔 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-5-7 22:18:06 | 显示全部楼层

C++语言是基于面向对象的语言,类是其基本的数据类型,封装了属性和实现方法(包括成员函数)
这就像一个零件(可能比喻不怎么恰当),举个例子来说吧:
C++这样用类来描述动物:
所有的动物是一个类: animal。
animal有自己的属性,如age,weight,color等。
animal也有自己的方法,例如getAge(),getWeight(),getColor(),speak(),move()等等;这些就是其成员函数。
所以animal是一个基类。
然后可以从animal派生出很多类别,如dog,cat,
dog除了有基类的一些属性,也可以有自己的一些属性,如,breed,
dog也有自己的方法,这些方法可以继承自animal,也可以覆盖animal的方法,还可以创建新的方法或者成员函数。
如,dog 会dog.speak(),dog.move(),dog.bark()等等。
C++继承了C语言的一些东西,把类型的申明放在 .h文件中(头文件)
把定义放在.cpp文件中(实现文件)
如我先申明了一个函数
int myfunc();
然后在.cpp文件中实现
int myfunc()
{
//下面是实现代码
........
return 0 ;
}
MFC,微软基础类(Microsoft Foundation Classes),说白了就是对话框及菜单等各种资源。
什么是DLL,DLL 是一个包含可由多个程序同时使用的代码和数据的库。DLL是Dynamic Link Library的缩写,意为动态链接库,当执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件.
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。下表说明了 Windows 操作系统中的一些作为 DLL 实现的文件: ActiveX 控件 (.ocx) 文件ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。 控制面板 (.cpl) 文件.cpl 文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL。 设备驱动程序 (.drv) 文件设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。
这些都扯远了,跟lisp扯不上关系。如果你要了解,不妨买一本C++语言的书来看看。
我这篇主要是谈如何让lisp也能利用C++的类。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-7 22:19:28 | 显示全部楼层
高版本的CAD调很多都不能成功,不知为何。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-5-7 22:30:33 | 显示全部楼层
请问楼主,ARX能转化为LISP吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 11:01:57 | 显示全部楼层
高手中的战斗机
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-20 19:46:37 | 显示全部楼层
楼主示例为精华所在,在此受教了,感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-6-21 10:17:28 | 显示全部楼层
有点深奥,新人路过
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-24 03:54:05 | 显示全部楼层
看的不明白,哈不是高手
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-9 22:05:29 | 显示全部楼层
致敬,标记,用到再学哦:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-10 08:04:37 | 显示全部楼层
感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 828个

财富等级: 财运亨通

发表于 2013-10-12 00:00:18 | 显示全部楼层
arx没有学过,现在学习lisp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-8-28 21:24:59 | 显示全部楼层
多谢版主分享。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-7-26 20:16:57 | 显示全部楼层
高手啊,崇拜
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-7-27 08:29:03 | 显示全部楼层
对lisp倒是能看懂,但对这东西还真是不懂:D
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2018-4-14 09:36:40 | 显示全部楼层
DLL 的注册如何突破管理员模式?
(defun DLLRegister (dll)
  (startapp "regsvr32.exe" (strcat "/s \"" dll "\""))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 00:26 , Processed in 0.273462 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表