找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1342|回复: 4

[每日一码] lisp+c#混合编程之--C#调用lisp函数(源码)

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2021-2-1 15:55:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 print1985 于 2021-2-1 23:35 编辑

复制代码
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;

  5. namespace ClassLibrary1
  6. {
  7.     public class Class1
  8.     {
  9.         [CommandMethod("Test1", CommandFlags.Session)]
  10.         static public void Test1()
  11.         {
  12.             ResultBuffer pa = new ResultBuffer(); //lisp参数
  13.             ResultBuffer rb = new ResultBuffer(); //lisp返回值
  14.             pa.Add(new TypedValue((int)LispDataType.Text, "c:lisp1")); //lisp函数名字
  15.             pa.Add(new TypedValue((int)LispDataType.Double, 123));  //lisp参数1 Double类型也可直接用5001代码
  16.             //pa.Add(new TypedValue(5001, 123)); //也可直接用5001代码
  17.             rb = Application.Invoke(pa); //调用lisp函数,并取得返回值
  18.             if (rb != null)
  19.             {
  20.                 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  21.                 TypedValue[] Array = rb.AsArray(); //返回值为数组
  22.                 string str = Array[0].Value.ToString();
  23.                 ed.WriteMessage("lisp返回值为:" + str);
  24.             }

  25.             //lisp参数类型及代码
  26.             //None = 5000,
  27.             //Double = 5001,
  28.             //Point2d = 5002,
  29.             //Int16 = 5003,
  30.             //Angle = 5004,
  31.             //Text = 5005,
  32.             //ObjectId = 5006,
  33.             //SelectionSet = 5007,
  34.             //Orientation = 5008,
  35.             //Point3d = 5009,
  36.             //Int32 = 5010,
  37.             //Void = 5014,
  38.             //ListBegin = 5016,
  39.             //ListEnd = 5017,
  40.             //DottedPair = 5018,
  41.             //Nil = 5019,
  42.             //T_atom = 5021
  43.         }
  44.     }
  45. }

  1. (defun c:lisp1(a) (princ (strcat "C#传入lisp参数为:" (rtos a) "\n")) 456)



关于C#调用lisp的源码好像较少,我弄了个超简单的,给需要的朋友


评分

参与人数 1D豆 +5 收起 理由
marting + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 7个

财富等级: 恭喜发财

发表于 2021-2-1 16:29:01 | 显示全部楼层
谢谢楼主分享,学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3915个

财富等级: 富可敌国

发表于 2021-2-2 08:01:57 | 显示全部楼层
谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2021-2-2 10:22:42 | 显示全部楼层
谢谢楼主分享,学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2023-12-22 14:58:51 | 显示全部楼层
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using System.Runtime.InteropServices;

[assembly: CommandClass(typeof(Sample.CH6_8_3))]
namespace Sample
{
    class CH6_8_3
    {
        [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedInvoke")]
        private static extern int acedInvoke(IntPtr args, out IntPtr result);

        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;
        }

        [CommandMethod("CallLispFunction")]
        public void CallLispFunction()
        {
            ResultBuffer args = new ResultBuffer();
            int stat = 0;
            args.Add(new TypedValue((int)LispDataType.Text, "c:CallByNet"));
            ResultBuffer res = InvokeLisp(args, ref stat);
        }

        [LispFunction("CallByLispFunction")]
        public static void CallByLispFunction(ResultBuffer rbArgs)
        {
            foreach (TypedValue rb in rbArgs)
                if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
                    Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(rb.Value.ToString());
        }
    }
}

(defun c:CallByNet()
  (setq p1 (getpoint"输入第一点:"))
  (setq p2 (getpoint"输入第二点:"))
  (command "line" p1 p2 "")
)
(defun c:CallNet()
  (setq t1 "BimCad.org")
  (setq t2 "数字建筑")
  (CallByLisp t1 t2)
)
书上抄来的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 01:00 , Processed in 0.299570 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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