明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1717|回复: 6

[基础] [求助]C#编写的函数,有办法于LISP中呼叫并将运算资料进行传递吗?

[复制链接]
发表于 2014-3-4 13:14 | 显示全部楼层 |阅读模式
请教各位高手
C#编写的函数,有办法于LISP中呼叫并将运算资料进行传递吗?

烦请各位能够协助解答一下,谢谢~

发表于 2014-3-4 14:50 | 显示全部楼层
不明白楼主的问题
不过C#可以定义Lisp函数供Lisp使用,C#也可以使用Lisp函数(需要注册)
---------------------------
这里是说在较新版本的AutoCAD
 楼主| 发表于 2014-3-4 14:53 | 显示全部楼层
谢谢解答~请问您说的部份哪边可以找到范例资料呢?是否可以提供,谢谢~
发表于 2014-3-4 16:55 | 显示全部楼层
http://user.qzone.qq.com/812928665/infocenter?ptsig=VqFz*FJZppcBJ8FFEY8WcJIsdH05z0cArysBaljnHFU_
发表于 2014-3-4 16:59 | 显示全部楼层
上面连接好像有问题,
就是空间里面的<C#定义Visual Lisp函数>日志
发表于 2014-3-4 23:14 | 显示全部楼层
建议LZ先看看有关C#与Lisp语言混合编程这方面的就可以实现你的要求了
发表于 2014-3-25 15:24 | 显示全部楼层
  1. ''' <summary>
  2. ''' 用.NET来运行Lisp的工具
  3. ''' </summary>
  4. ''' <remarks>1.实例化后,先LoadLisp</remarks>
  5. Public Class LispInDotNet
  6.     Private mVlFunctions As Object = Nothing
  7.     ''' <summary>
  8.     ''' Lisp的函数对象集
  9.     ''' </summary>
  10.     ''' <value></value>
  11.     ''' <returns></returns>
  12.     ''' <remarks></remarks>
  13.     Public ReadOnly Property VlFunctions As Object
  14.         Get
  15.             Return mVlFunctions
  16.         End Get
  17.     End Property

  18.     Private mLoadSuccessful As Boolean = False
  19.     ''' <summary>
  20.     ''' 是否加载成功
  21.     ''' </summary>
  22.     ''' <value></value>
  23.     ''' <returns></returns>
  24.     ''' <remarks></remarks>
  25.     Public ReadOnly Property LoadSuccessful As Boolean
  26.         Get
  27.             Return mLoadSuccessful
  28.         End Get
  29.     End Property
  30.     ''' <summary>
  31.     ''' 加载Lisp运行环境
  32.     ''' </summary>
  33.     ''' <returns></returns>
  34.     ''' <remarks></remarks>
  35.     Public Function LoadLisp() As Boolean
  36.         '状态:20131126-1348测试通过
  37.         Try
  38.             Dim acadApp As Object = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  39.             Dim vlApp As Object = acadApp.GetInterfaceObject("VL.Application.16") '此处出错,可能是因为没有加载VL环境所致, (vl-load-com)
  40.             'VL.Application.16 为什么会是16?到AutoCAD各版本的安装目录里到查找,会发现一个vl16.tlb,这个文件就是visual lisp的运行环境,到AutoCAD 2014为止,这个文件一直没有更新。
  41.             mVlFunctions = vlApp.ActiveDocument.Functions
  42.             mLoadSuccessful = True
  43.             Return True
  44.         Catch ex As Autodesk.AutoCAD.Runtime.Exception
  45.             Return False
  46.         End Try
  47.     End Function

  48.     ''' <summary>
  49.     ''' 运行Lisp函数
  50.     ''' </summary>
  51.     ''' <param name="FunctionName"></param>
  52.     ''' <param name="args">参数数组</param>
  53.     ''' <param name="runSuccessful">是否运行成功</param>
  54.     ''' <param name="ErrMsg">出错信息</param>
  55.     ''' <returns></returns>
  56.     ''' <remarks></remarks>
  57.     Public Function RunLispFunction(ByVal FunctionName As String, args() As Object, Optional ByRef runSuccessful As Boolean = False, Optional ByRef ErrMsg As String = "") As Object
  58.         '状态:20131126-1711通过测试
  59.         runSuccessful = False
  60.         If Me.LoadSuccessful = True Then
  61.             If Me.HasLispFunction(FunctionName) = False Then
  62.                 Return Nothing
  63.             End If
  64.             Try
  65.                 Dim vlFunction As Object = mVlFunctions.Item(FunctionName)
  66.                 RunLispFunction = vlFunction.GetType.InvokeMember("funcall", BindingFlags.InvokeMethod, Nothing, vlFunction, args)
  67.                 runSuccessful = True
  68.             Catch ex As System.Reflection.TargetInvocationException
  69.                 ErrMsg = ex.Message
  70.                 Return Nothing
  71.             End Try
  72.         Else
  73.             Return Nothing
  74.         End If
  75.     End Function

  76.     ''' <summary>
  77.     ''' 查询当前环境是否有某个Lisp函数或者变量
  78.     ''' </summary>
  79.     ''' <param name="functionNameOrValueName"></param>
  80.     ''' <returns></returns>
  81.     ''' <remarks></remarks>
  82.     Public Function HasLispFunction(ByVal functionNameOrValueName As String) As Boolean
  83.         '状态:20131126-1534通过测试
  84.         Dim vlFunction As Object = mVlFunctions.Item("read")
  85.         Dim sym As Object = vlFunction.GetType.InvokeMember("funcall", BindingFlags.InvokeMethod, Nothing, vlFunction, New Object() {functionNameOrValueName})
  86.         If sym Is Nothing Then
  87.             Return False
  88.         Else
  89.             Dim vlFuncEval As Object = mVlFunctions.Item("eval")
  90.             If vlFunction.GetType.InvokeMember("funcall", BindingFlags.InvokeMethod, Nothing, vlFuncEval, New Object() {sym}) Is Nothing Then
  91.                 Return False
  92.             Else
  93.                 Return True
  94.             End If
  95.         End If
  96.     End Function

  97.     ''' <summary>
  98.     ''' 获取Lisp变量的值
  99.     ''' </summary>
  100.     ''' <param name="ValueName"></param>
  101.     ''' <returns></returns>
  102.     ''' <remarks></remarks>
  103.     Public Function GetValue(ValueName As String) As Object
  104.         '状态:20131126-1534通过测试
  105.         Return Eval(ValueName)
  106.     End Function

  107.     ''' <summary>
  108.     ''' 获取一个Lisp语句的值
  109.     ''' </summary>
  110.     ''' <param name="LispString"></param>
  111.     ''' <returns></returns>
  112.     ''' <remarks></remarks>
  113.     Public Function Eval(LispString As String) As Object
  114.         '状态:20131126-1534通过测试
  115.         Try
  116.             Dim sym As Object = RunLispFunction("read", New Object() {LispString})
  117.             If sym Is Nothing Then
  118.                 Return Nothing
  119.             Else
  120.                 Return RunLispFunction("eval", New Object() {sym})
  121.             End If
  122.         Catch ex As Exception
  123.             Return Nothing
  124.         End Try
  125.     End Function

  126.     ''' <summary>
  127.     ''' 设置Lisp变量的值
  128.     ''' </summary>
  129.     ''' <param name="ValueName">变量名</param>
  130.     ''' <param name="Value">变量值</param>
  131.     ''' <returns></returns>
  132.     ''' <remarks></remarks>
  133.     Public Function SetValue(ByVal ValueName As String, ByVal Value As Object) As Boolean
  134.         '状态:20131126-1534通过测试
  135.         Dim suc As Boolean = False, errMsg As String = ""
  136.         Dim sym As Object = Me.RunLispFunction("read", New Object() {ValueName}, suc, errMsg)
  137.         If suc Then
  138.             Me.RunLispFunction("set", New Object() {sym, Value}, suc, errMsg)
  139.             If suc Then
  140.                 Return True
  141.             Else
  142.                 Return False
  143.             End If
  144.         Else
  145.             Return False
  146.         End If
  147.     End Function



  148. End Class


有兴趣的话,可以参考一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 10:00 , Processed in 0.376114 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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