vectra 发表于 2017-9-22 23:48:33

使用.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-22 23:54:14

本帖最后由 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值。也就是一行代码的事,而且可靠性是由微软帮你保证的。


vectra 发表于 2017-9-23 09:31:17

xinxirong 发表于 2017-9-23 06:20
我想要个带ss,ang参数,批量改旋转角度的例子

com适合做些与cad类库无关的东西,否则就失去了它的优势了。写这篇文章不是说要用.net去代替lisp,而是扩展lisp中难以实现的功能,你说的东西还是交给lisp, arx去做吧。

77077 发表于 2020-9-24 00:32:44

感谢楼主提供思路,情不自禁的回复了一下。
命令: (setq str (vlax-invoke o "getStringDlg" "title" "str"))
返回:"第一行文字\r\n第二行文字\r\n...\r\n第n行文字"


xinxirong 发表于 2017-9-23 06:20:07

我想要个带ss,ang参数,批量改旋转角度的例子

shh1980 发表于 2017-9-23 07:46:16

本帖最后由 shh1980 于 2017-9-23 08:10 编辑

感谢楼主分享,能不能举几个具体应用的例子!!!

yshf 发表于 2017-9-23 08:51:11

谢谢分享!

xinxirong 发表于 2017-9-23 09:38:39

我记得vb只要引用cad库就可以做cad开发

brainstorm 发表于 2017-9-23 10:16:52

能再给几个具体的应用么

菜卷鱼 发表于 2017-9-23 15:48:40

能力之外,看不懂了:dizzy:

柱哥 发表于 2017-9-23 20:26:28

很强大
页: [1] 2
查看完整版本: 使用.net扩展lisp