明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5501|回复: 17

[经验] 使用.net扩展lisp

[复制链接]
发表于 2017-9-22 23:48:33 | 显示全部楼层 |阅读模式
本帖最后由 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/OpenS ... amp;Release=Zimnitz
1、选择 文件->新建->解决方案,依次选择C#、类库,.NET框架选择2.0版,名称自定,示例中为hello,确定

2、在解决方案下hello右键->属性,在工程属性Assembly Info页中勾选“Make assembly COM-visible”;


在签名页中勾选“为程序集签名”,其它采用默认设置,注意目标CPU是任意处理器


3、将MyClass.cs文件中代码替换为

  1. namespace hello
  2. {
  3.         /// <summary>
  4.         /// Description of MyClass.
  5.         /// </summary>
  6.         public class MyClass
  7.         {
  8.                 public string hello()
  9.                 {
  10.                         return ".net COM";
  11.                 }
  12.         }
  13. }
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中调用。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 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里添加如下代码:

  1. public string md5(string str)
  2. {
  3. return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();     
  4. }


使用新生成的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值。也就是一行代码的事,而且可靠性是由微软帮你保证的。


评分

参与人数 2明经币 +3 金钱 +15 收起 理由
springwillow + 1 赞一个!
qjchen + 2 + 15 赞一个!

查看全部评分

 楼主| 发表于 2017-9-23 09:31:17 来自手机 | 显示全部楼层
xinxirong 发表于 2017-9-23 06:20
我想要个带ss,ang参数,批量改旋转角度的例子

com适合做些与cad类库无关的东西,否则就失去了它的优势了。写这篇文章不是说要用.net去代替lisp,而是扩展lisp中难以实现的功能,你说的东西还是交给lisp, arx去做吧。
发表于 2020-9-24 00:32:44 | 显示全部楼层
感谢楼主提供思路,情不自禁的回复了一下。
命令: (setq str (vlax-invoke o "getStringDlg" "title" "str"))
返回:"第一行文字\r\n第二行文字\r\n...\r\n第n行文字"


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2017-9-23 06:20:07 来自手机 | 显示全部楼层
我想要个带ss,ang参数,批量改旋转角度的例子
发表于 2017-9-23 07:46:16 | 显示全部楼层
本帖最后由 shh1980 于 2017-9-23 08:10 编辑

感谢楼主分享,能不能举几个具体应用的例子!!!
发表于 2017-9-23 09:38:39 | 显示全部楼层
我记得vb只要引用cad库就可以做cad开发
发表于 2017-9-23 10:16:52 来自手机 | 显示全部楼层
能再给几个具体的应用么
发表于 2017-9-23 15:48:40 | 显示全部楼层
能力之外,看不懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:45 , Processed in 0.193536 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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