明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2924|回复: 9

请教c# 如何加载LSP、VLX等

[复制链接]
发表于 2014-10-20 15:18:33 | 显示全部楼层 |阅读模式
本帖最后由 cheng5276 于 2014-10-20 15:31 编辑

小弟初转C#.以前学LISP的,故很多以前写的LISP程序需要同步使用。
打算在CAD启动时,在自动加载的自定义DLL中加入加载vlx的功能,从而完成整个程序的初始化。

以下为为CAD2010中文版加入自动加载DLL的注册表方法
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.0\ACAD-8001:804\Applications\景观工具]
"LOADER"="C:\\工具包\\初始化.dll"
"MANAGED"=dword:0001c101
"LOADCTRLS"=dword:0001c102

目前仅知如下方法:
1、利用ACAD.LSP等文件的方法,在其中加入如下代码:
(load "c:\\AAA\\001.VLX)
      缺点:很多CAD病毒,都是利用此类文件,当采用此方法,非常容易被杀毒软件误杀掉,造成启动失败

2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \"C:\\\\NITA(杭州)工具包\\\\DATA\\\\HB01.vlx\") ", true, false, false);
缺点:经常无法加载成功,原因未知(可能是因为CAD此时并未启动好,故这个SendStringToExecute方法无法执行吧,如果是自己手动加载这个DLL,此时是能够执行成功的)

请教老大们有其他更好的方式么?

发表于 2014-10-22 08:32:34 | 显示全部楼层
2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \"C:\\\\NITA(杭州)工具包\\\\DATA\\\\HB01.vlx\") ", true, false, false);
缺点:经常无法加载成功,原因未知(可能是因为CAD此时并未启动好,故这个SendStringToExecute方法无法执行吧,如果是自己手动加载这个DLL,此时是能够执行成功的)
-----------------------------------
根据我碰到的情况,这里是否成功的和AutoCAD的状态有关,假如AutoCAD可以执行命令了,这个方法是没有问题的,但假如AutoCAD还在启动过程中,判断为命令行没有提示有命令被执行过,则此方法是不被执行的,我用的是SendCommand,情况应该是一样
发表于 2014-10-22 08:34:28 | 显示全部楼层
另外,在一个命令里面装载Lisp文件,同时在这个命令里面执行该Lisp文件的函数,应该也是不行的
发表于 2014-10-22 08:45:55 | 显示全部楼层
sieben 发表于 2014-10-22 08:32
2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument ...

前面表述有误,我用SendCommand不是不执行,应该是执行装载成功了,但Lisp里面的函数要等到可以执行命令后才可以被C#调用
 楼主| 发表于 2014-10-23 14:22:23 | 显示全部楼层
sieben 发表于 2014-10-22 08:45
前面表述有误,我用SendCommand不是不执行,应该是执行装载成功了,但Lisp里面的函数要等到可以执行命令后才 ...

谢谢老大,有没有什么方法能够判断CAD已经启动完毕,此时进入了可执行LISP函数的状态呢?
 楼主| 发表于 2014-10-23 14:30:11 | 显示全部楼层
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入自动判断并加载LSP的代码了。

初始化时,设置一公共全局变量
Public Static Bool LOADED=FALSE;

在按钮函数中加入;
if (!LOADED)
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \".........vlx\") ", true, false, false);
LOADED=true;
}


发表于 2014-10-23 15:42:00 | 显示全部楼层
cheng5276 发表于 2014-10-23 14:22
谢谢老大,有没有什么方法能够判断CAD已经启动完毕,此时进入了可执行LISP函数的状态呢?

程序方法我没有,在用户的角度有,就是当AutoCAD的命令行上可以看到"命令:"这个提示时,Lisp的函数就可以调用了
发表于 2014-10-23 15:47:25 | 显示全部楼层
cheng5276 发表于 2014-10-23 14:30
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入 ...

这里有两个没有用
1,如果AutoCAD还在启动过程中,这个函数是可以执行的,你的Load会被设置为true,但是你的Lisp函数还是不能被调用
2,如果你所说的按钮是通过你的一个命令弹出一个对话框的按钮,那么可以确定你的Lisp函数已经可以调用,只要你的Lisp文件已经装载,因为AutoCAD已经处在可以执行命令的状态

注:装载Lisp文件的是可以在AutoCAD启动过程中执行的,只是Lisp文件里面的函数不能在AutoCAD启动过程调用
发表于 2014-10-23 15:49:02 | 显示全部楼层
cheng5276 发表于 2014-10-23 14:30
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入 ...

当然,如果你不打算在AutoCAD的启动过程就装载你的Lisp文件,你这里的方法也是挺好的
 楼主| 发表于 2014-10-23 19:13:30 | 显示全部楼层
sieben 发表于 2014-10-23 15:49
当然,如果你不打算在AutoCAD的启动过程就装载你的Lisp文件,你这里的方法也是挺好的

是的,如果无法判断CAD是否启动完毕,那我就不在启动时加载LSP,直接在后期按需加载了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:51 , Processed in 0.172087 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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