使用.net扩展lisp
本帖最后由 vectra 于 2017-9-23 08:16 编辑原来写过一篇类似的东西,论坛down掉之后丢了,现在补充一下。
本来这个东西放在activeX版里更合适,但为了让更多lisper能看到并对COM开发产生兴趣,所以还是发在人气较旺的lisp版了。
.NET开发COM供lisp使用有以下优势:
1、平台无关,你只需要维护一个源代码版本,一次编译即可支持各个CAD版本,甚至同时支持32和64位的CAD;
(你只需要一个myfunc.dll,而不需要myfunc.cad2008.32bit.dll、myfunc.cad2012.32bit.dll、myfunc.cad2012.64bit.dll...这些文件)
2、可以使用.NET异常丰富的类库,而不必重新从轮子开始;
3、可以独立开发和测试,与CAD耦合性较小,除了CAD其它支持COM交互的软件也可以调用你的类库
4、lisp端调用方式一致,类库升级不需考虑版本问题,如果更新了myfunc.dll,你就自动获得了添加的功能和bug修复。
手把手流程:
类库开发工具使用了SharpDevelop 5.1,安装文件约13M,想尝试的同学不必去下载安装好几个G的visual studio。
在此下载 http://www.icsharpcode.net/OpenSource/SD/Download/GetFile.aspx?What=Setup&Release=Zimnitz
1、选择 文件->新建->解决方案,依次选择C#、类库,.NET框架选择2.0版,名称自定,示例中为hello,确定
2、在解决方案下hello右键->属性,在工程属性Assembly Info页中勾选“Make assembly COM-visible”;
在签名页中勾选“为程序集签名”,其它采用默认设置,注意目标CPU是任意处理器
3、将MyClass.cs文件中代码替换为
namespace hello
{
/// <summary>
/// Description of MyClass.
/// </summary>
public class MyClass
{
public string hello()
{
return ".net COM";
}
}
}4、"F9"或“菜单”->“生成”->“生成 hello”
5、运行下面的命令注册组件,注意为方便,生成的类库已复制到D盘根目录。使用32和64位的regasm.exe各注册一次,hello.dll是同一个文件。
C:\windows\microsoft.net\Framework\v2.0.50727\regasm.exe d:/hello.dll /codebase d:\hello.dll
C:\windows\microsoft.net\Framework64\v2.0.50727\regasm.exe d:/hello.dll /codebase d:\hello.dll
至此类库端就完成了,下面看如何在lisp中调用。
本帖最后由 vectra 于 2017-9-23 09:40 编辑
6、lisp端使用其实很简单,主要是vlax-create-object和vlax-invoke,用完记得vlax-release-object就行
启动cad 2008 32bit(08只有32位吧)
命令: (setq o (vlax-create-object "hello.myclass"))
#<VLA-OBJECT _MyClass 05e2ff8c>
命令: (princ (vlax-invoke o "hello"))
.net COM".net COM"
启动cad2012 64bit
命令: (setq o (vlax-create-object "hello.myclass"))
#<VLA-OBJECT _MyClass 0000000008f2f698>
命令: (princ (vlax-invoke o "hello"))
.net COM".net COM"
可见,均能正常返回期望的值。调用类库只需要搞清类库的名称,而不用关心类库的版本。不同cad平台上调用类库的lisp代码是完全一样的。
扩展(MD5实现):
看看COM方式如何帮你的lisp计算MD5值
引用里添加 System.Web后,在MyClass.cs里添加如下代码:
public string md5(string str)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
}
使用新生成的dll替换D盘上的hello.dll文件,注意如果cad里加载过此类库,可能造成文件占用无法替换,此时要关闭cad后才能替换文件
再在LISP里测试
_$ (setq o (vlax-create-object "hello.myclass"))
#<VLA-OBJECT _MyClass 05f4ff8c>
_$ (princ (vlax-invoke o "md5" "lisper"))
3d69708ee30384a14d0e1d7ffa1a104a"3d69708ee30384a14d0e1d7ffa1a104a"
可见类库名及函数名不区分大小写,并且正常返回了lisper字符串的md5值。也就是一行代码的事,而且可靠性是由微软帮你保证的。
xinxirong 发表于 2017-9-23 06:20
我想要个带ss,ang参数,批量改旋转角度的例子
com适合做些与cad类库无关的东西,否则就失去了它的优势了。写这篇文章不是说要用.net去代替lisp,而是扩展lisp中难以实现的功能,你说的东西还是交给lisp, arx去做吧。 感谢楼主提供思路,情不自禁的回复了一下。
命令: (setq str (vlax-invoke o "getStringDlg" "title" "str"))
返回:"第一行文字\r\n第二行文字\r\n...\r\n第n行文字"
我想要个带ss,ang参数,批量改旋转角度的例子 本帖最后由 shh1980 于 2017-9-23 08:10 编辑
感谢楼主分享,能不能举几个具体应用的例子!!! 谢谢分享! 我记得vb只要引用cad库就可以做cad开发 能再给几个具体的应用么 能力之外,看不懂了:dizzy: 很强大
页:
[1]
2