AutoCAD的二次开发

autocad的二次开发
autocad的二次开发主要涉及以下内容:
(1)编写各种用户自定义函数并形成若干lisp、arx、vlx或ads文件,以及一些dcl文件。
(2)建立符合自己要求的菜单文件,一般可在autocad原菜单文件内添加自己的内容,对于autocad2000版本还可增加部分菜单文件,然后经交互方式加入到系统中去。
(3)在系统的acad.lsp或类似文件中加入某些内容以便进行各种初始化操作,如在启动时立即装入一些文件等。
(4)通过系统对话框设置某些路径。这些操作在程序开发成功后向其它autocad系统上安装应用,特别是需要大批安装时,需要进行很多文件检索、内容增删、子目录创建、文件拷贝、系统设置等繁琐工作,如能令上述工作全部自动进行,使整个二次开发程序在无人干预的情况下嵌入系统,将大大提高工作效率。为此笔者用vc++开发了一套自动安装程序,使原本需要五、六分钟的人工操作在十几秒内即可自动完成。
一、 基本思路
整个安装程序遵循以下思路:
1) 首先获得所在机器autocad2000系统的安装路径;
2) 寻找菜单文件autocad2000\\support\\acad.mnu,打开文件并将要添加的内容加至末尾;
3) 寻找lisp文件autocad2000\\support\\acad2000doc.lsp,打开文件并将要添加的内容加至末尾;
4) 创建一个预先命名的子目录,将所有二次开发形成的各类文件拷入;
5) 给出信息框,告知安装成功,如有问题则告知安装失败。
需要指出的是,在添入acad2000doc.lsp的内容中须有如下语句:
(command“_menu”(strcat (getvar menuname) .mnu)),目的是为了强制执行菜单文件装入命令,将改动后的acad.mnu文件编译后装入。
另外,在添入acad2000doc.lsp的内容中还有一赋值语句,将准备创建的包含所有二次开发生成文件的子目录全路径名赋予一全局变量,以供二次开发程序在需要时调用,从而避免了在autocad环境下交互设定路径的麻烦。
二、 实现方式及关键函数
为获得autocad2000的安装路径,需要利用windows系统注册表的有关功能。
首先通过regopenkey函数打开注册表:
hkey hkey;
longret=regopenkey( hkey_local_machine, software\\autodesk\\autocad\\r14.0\\acad-1:804, &hkey);
其中第一参数hkey_local-machine为注册表中预定义的主键句柄,第二参数为注册表中hkey_local_machine下的子键内容,第三参数hkey将返回一子键句柄,用于接下来的键值查询。若该函数运行成功,将返回一长整型数error_success。
接下来利用regqueryvalueex函数进行键值查询:
dword dwtype=reg_sz;
byte szdata[100];
dword dwsize=sizeof(szdata);
if (ret=error_success)
ret=regqueryvalueex(hkey, acadlocation, 0, &dwtype, szdata, &dwsize);
其中第一参数hkey为由regopenkey函数获得的欲查询的子键句柄;第二参数“acadlocation”为欲查询的键值名;第三参数为保留项,要求添0;第四参数为键值数据类型;第六参数为键值缓冲器容量;最关键的是第五参数szdata,欲查询的键值结果将由其带回,该键值即为所需要的autocad2000的安装路径。
以上涉及到的有关注册表中主键、子键、键值名、及键值的关系可通过下列方法由windows系列注册表查出:单击“开始”――“运行”――添入“regedit”――“确定”――“hkey_local_machine”――“software”――“autodesk”――“autocad”――“r15.0”――“acad-1:804”――“acadlocation”――“e:\autocad2000”。其中的键值名“acadlocation”所对应的键值为“e:\autocad2000”,就是autocad2000的安装路径,在不同的机器上可能内容不同。
键值查询函数若运行成功,将返回长整型数error_success。
下面可利用szdata带回的路径名与已知路径名组合成全路径从而打开菜单文件acad.mnu添加内容:
char szrootname[100]=\\support\\acad.mnu;
if (ret=error_success)
1strcat((char*) szdata, szrootname);
现在szdata中装有acad.mnu的全路径,以下操作将打开该文件并添入内容:
handle hfile=createfile((char*) szdata, generic_read|generic_write, 0,
null, open_existing, file_attribute_normal, null);
if(hfile!=invalid_handle_value)
{
if (0xffffffff!=setfilepointer(hfile, 0, null, file_end))
{
char szbuf[1000]=\n***pop12\n**cam\n[&cam]\n[->基本参数]\n[卡盘原点]^c^cchuck_datam\n[换刀原点] ^c^ctool_datam\n[刀具管理]\n《创建新刀》 ^c^ccreate_new_tool\n[<-刀库增删] ^c^ctool_manage\n;
dword dwwrite=0;
bret=writefile(hfile, szbuf, lstrlen(szbuf), &dwwrite, null);
if (!bret) printerror();
}
closehandle(hfile);
}
上述操作中用createfile函数打开文件,setfilepointer函数将指针移至文件末尾,字符串数组szbuf中装有欲添加的内容,以writefile函数写入,printerror为自编的错误处理函数。
以同样的方法可以找到acad2000doc.lsp文件并添入内容。
以下操作将创建一个名为“c:\hkcam”的子目录,并将事先准备好的本程序所在目录下的所有文件拷贝进去:
cstring nam1, nam2;
bool bcreate=createdirectory(c:\\hkcam, null);//创建子目录
cfilefind finder; //创建类对象
bool b working=finder.findfile(*.*);//利用类函数搜索所有文件
while(b working)//循环搜索及文件拷贝
{
b working=finder.findnextfile();
nam1= finder.getfilename();//获得文件名
nam2= c:\\hkcam\\;
nam2=nam2+nam1;//组成全路径
bool bcopy=copyfile(nam1, nam2, false);//文件拷贝
}
所有操作成功后,以信息框告知:
messagebox( null,“安装成功,请按ok钮继续”,“安装结果”,mb_ok);
整个程序以mfc静态链接库创建。上述所有内容可以写入一个源文件内,这里称其为append.cpp。为使最终执行文件尽可能小,应删去程序框架中所有不需要的内容。为此,源文件中只保留append.cpp,append.rc,及stdafx.cpp几项;而头文件中只有append.h,resource.h,及stdafx.h几项。所定义的唯一派生类为class cappendapp:public cwinapp,置于append.h之内。
三、结束语
在vc++环境下利用有关windows系统注册表操作函数获得autocad系统的安装路径,从而找出并改写autocad有关文件;创建子目录并拷入各种二次开发形成文件,由此实现了autocad二次开发程序与autocad系统的自动衔接与嵌入。文中程序已由实践验证,完全可用于autocad二次开发程序的自动安装。

4WS系统电控部分的组成
CDMA即将在国内成为历史
5G时代新体验,你本可以大不一样
放大器偏移的解决方案
基于CS5460A的功率检测运算电路
AutoCAD的二次开发
山东高速和高德联合推出国内首个高速收费站通行状态物联网解决方案
德州仪器为微控制器(MCU)LaunchPad系列添加新成员
是时候跟去年的iPhone7,说声再见了!
比亚迪纯电动大巴订单在海外运营 南芯推出A+C双口快充协议控制芯片
氢能储能电源设计:一个新的绿色解决方案
汽车动力系统升压控制器最新解决方案
量子计算赋能人工智能是怎样改变的
一键多功能按键识别技术
一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事
振荡器上的频率跃迁
开发板烧写程序
iPhone4绝版卡涨价300元
AT&T版iPhone下载速度远超Verizon版
svpwm与spwm的区别和联系