几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(VB.NET/C#)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-04-20, 08:18 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】关于调用dll及lisp文件

关于调用dll及lisp文件
www.dimcax.com
关于调用dll及lisp文件
using system; using system.runtime.interopservices; using autodesk.autocad.runtime; using autodesk.autocad.applicationservices; using autodesk.autocad.databaseservices; using autodesk.autocad.editorinput; using acrx = autodesk.autocad.runtime; using aced = autodesk.autocad.editorinput; using acdb = autodesk.autocad.databaseservices; using acap = autodesk.autocad.applicationservices; [assembly: commandclass(typeof(vcarx.adsinvoke))] namespace vcarx { public class adsinvoke { [system.security.suppressunmanagedcodesecurity] [dllimport("acdb16.dll", callingconvention = callingconvention.cdecl, entrypoint = "?acdbgetadsname@@ya?w4errorstatus@a...cdbobjectid@@@z")] private static extern int acdbgetadsname(long[] name, objectid objid); [dllimport("acad.exe", callingconvention = callingconvention.cdecl, entrypoint = "acdbentget")] private static extern system.intptr acdbentget(long[] name); static public long[] getename(objectid id) { long[] ename=new long[]{0,0}; acdbgetadsname(ename,id); return ename; } static public resultbuffer entget(long[] ename) { system.intptr rb = acdbentget(ename); acdb.resultbuffer dxflist = acrx.disposablewrapper.create(typeof(acdb.resultbuffer), rb, true) as acdb.resultbuffer; return dxflist; } static public typedvalue assoc(short element ,resultbuffer elist) { typedvalue retu=new typedvalue(-1000,null); foreach (typedvalue val in elist.asarray()) { if (retu.typecode==element) return val; } return retu; } [commandmethod("dxfget")] static public void dxfget() { aced.editor ed = acap.application.documentmanager.mdiactivedocument.editor; aced.promptentityoptions entityopts = new aced.promptentityoptions("\n选择对象: "); aced.promptentityresult rc = ed.getentity(entityopts); if (rc.status == aced.promptstatus.ok) { long[] ent=getename(rc.objectid); resultbuffer dxflist=entget(ent); /*long[] ent = new long[] { 0, 0 }; acdbgetadsname(ent, rc.objectid); system.intptr rb = acdbentget(ent); acdb.resultbuffer dxflist = acrx.disposablewrapper.create(typeof(acdb.resultbuffer), rb, true) as acdb.resultbuffer; */ if (dxflist != null) { foreach (typedvalue val in dxflist.asarray()) { ed.writemessage("\n({0} . {1})", val.typecode, val.value.tostring()); } } } } } } 以上是调用c++ dll using system; using autodesk.autocad.applicationservices; using autodesk.autocad.databaseservices; using autodesk.autocad.runtime; using autodesk.autocad.editorinput; using system.runtime.interopservices; using acadapp = autodesk.autocad.applicationservices.application; [assembly: commandclass(typeof(caddzone.acedinvokesample))] namespace caddzone { public class acedinvokesample { public const int rtlong = 5010; // adscodes.h public const int rtstr = 5005; public const int rtnorm = 5100; public acedinvokesample() { } [system.security.suppressunmanagedcodesecurity] [dllimport("acad.exe", callingconvention = callingconvention.cdecl)] extern static private int acedinvoke(intptr args, out intptr result); // helper for acedinvoke() public static resultbuffer invokelisp(resultbuffer args, ref int stat) { intptr rb = intptr.zero; stat = acedinvoke(args.unmanagedobject, out rb); if( stat == (int) promptstatus.ok && rb != intptr.zero ) return (resultbuffer) disposablewrapper.create(typeof(resultbuffer), rb, true); return null; } static void printresbuf(resultbuffer rb) { string s = "\n-----------------------------"; foreach( typedvalue val in rb.asarray() ) s += string.format("\n{0} -> {1}", val.typecode, val.value.tostring()); s += "\n-----------------------------"; acadapp.documentmanager.mdiactivedocument. editor.writemessage(s); } [commandmethod("test")] public static void testinvokelisp() { resultbuffer args = new resultbuffer(); int stat = 0; args.add(new typedvalue(rtstr, "caiqs")); args.add(new typedvalue(rtstr, "abc")); args.add(new typedvalue(rtstr, "def")); resultbuffer res = invokelisp(args, ref stat); if( stat == rtnorm && res != null ) { typedvalue[] retu=res.asarray(); typedvalue objid=(typedvalue)retu.getvalue(0); //objectid id=(objectid)objid.value; printresbuf(res); res.dispose(); } } } } 以上是调用lisp 没看懂哪一句是 调用程序文件的地址? [commandmethod("dd")] static public void test1() { systemobjects.dynamiclinker.loadapp(ss,true,true); hostapplicationservices.current.loadapplication(aa,ds); } public virtual unsafe void loadapplication( string appname, applicationloadreasons why, [marshalas(unmanagedtype.u1)] bool printit, [marshalas(unmanagedtype.u1)] bool ascmd ); 这是调用.net dll 也没搞懂是怎么用的 请才鸟\ 师兄 指教
关于c#调用vlisp的解释
师兄 qq361865648 //允许调用非托管代码 [dllimport("acad.exe", callingconvention = callingconvention.cdecl)]//引入dll extern static private int acedinvoke(intptr args, out intptr result);//引入acedinvoke函数,注意参数定义了一个方法 public static resultbuffer invokelisp(resultbuffer args, ref int stat){...} 用于调用并取反回值它的参数args为链表,即你要调用的lisp表达式,stat为返回状态这里是直接调用的 resultbuffer args = new resultbuffer();//构建链表 int stat = 0; args.add(new typedvalue(rtstr, "caiqs"));//函数名称 args.add(new typedvalue(rtstr, "abc"));//第一个参数,为str型 args.add(new typedvalue(rtstr, "def"));//第二个参数,为str型 resultbuffer res = invokelisp(args, ref stat);//调用 例如你要调用一个lisp函数,函数名为caiqs,这个函数有两个rtstr型的参数,那么你先要构建一个链表,这个链表内容 (rtstr,函数名,rtstr,字符型参数1,rtstr,字符型参数2) 例似的,你可以调用任何一个lisp函数 当然在程序之前,你得预定义一些代表链数据格式的常量 public const int rtlong = 5010; // adscodes.h public const int rtstr = 5005; public const int rtnorm = 5100; 这些常量请参见c++ arx的相关内容 [
请问师兄c#中调用lisp方法后,能否取得lisp中的全局变量,如果可以,如何实现
设置lisp变量的值 acedputsym 取得lisp变量的值 acedgetsym [
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 04:08 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多