乐筑天下

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

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

[复制链接]

32

主题

140

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
268
发表于 2014-10-20 15:18:00 | 显示全部楼层 |阅读模式
小弟初转C#.以前学LISP的,故很多以前写的LISP程序需要同步使用。
打算在CAD启动时,在自动加载的自定义DLL中加入加载vlx的功能,从而完成整个程序的初始化。
以下为为CAD2010中文版加入自动加载DLL的注册表方法
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Autodesk\\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,此时是能够执行成功的)
请教老大们有其他更好的方式么?
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-22 08:32:00 | 显示全部楼层
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,情况应该是一样
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-22 08:34:00 | 显示全部楼层
另外,在一个命令里面装载Lisp文件,同时在这个命令里面执行该Lisp文件的函数,应该也是不行的
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-22 08:45:00 | 显示全部楼层

前面表述有误,我用SendCommand不是不执行,应该是执行装载成功了,但Lisp里面的函数要等到可以执行命令后才可以被C#调用
回复

使用道具 举报

32

主题

140

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
268
发表于 2014-10-23 14:22:00 | 显示全部楼层

谢谢老大,有没有什么方法能够判断CAD已经启动完毕,此时进入了可执行LISP函数的状态呢?
回复

使用道具 举报

32

主题

140

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
268
发表于 2014-10-23 14:30:00 | 显示全部楼层
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在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;
}
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-23 15:42:00 | 显示全部楼层

程序方法我没有,在用户的角度有,就是当AutoCAD的命令行上可以看到"命令:"这个提示时,Lisp的函数就可以调用了
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-23 15:47:00 | 显示全部楼层

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

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-10-23 15:49:00 | 显示全部楼层

当然,如果你不打算在AutoCAD的启动过程就装载你的Lisp文件,你这里的方法也是挺好的
回复

使用道具 举报

32

主题

140

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
268
发表于 2014-10-23 19:13:00 | 显示全部楼层

是的,如果无法判断CAD是否启动完毕,那我就不在启动时加载LSP,直接在后期按需加载了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-28 22:47 , Processed in 0.489550 second(s), 73 queries .

© 2020-2025 乐筑天下

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