.NET中调用lisp代码的一个类

从一个日本网站上找到的,原址为http://www1.harenet.ne.jp/~hanafusa/mt/memo/archives/000236.html

如果你不想或不能用acedCmd或SendCommand等,试一下这个。它用的是VLAX方式,源码如下:

Using directives

namespace  HLIB.Utils
{
  
/// <summary>
  
/// VisualLISPと通信。
  
/// (vl-load-com)を実行してないとだめ。
  
/// </summary>

  public class Lisp : IDisposable
  
{
    
private bool Disposed = false;
    
private object m_vlObj;
    
private object m_vlFunc;
    
private AcadApplication m_app;

    
/// <summary>
    
/// コンストラクタ
    
/// </summary>
    
/// <param name="acadApp">AutoCADアプリケーション</param>

    public Lisp ( AcadApplication acadApp )
    
{
      m_app 
= acadApp;
      
try {
        m_vlObj 
= acadApp.GetInterfaceObject( "VL.Application.16" );
        
object acDoc = GetProperty( m_vlObj, "ActiveDocument" );
        m_vlFunc 
= GetProperty( acDoc, "Functions" );
      }
 catch {
        AcEd.CommandLinePrompts.Message( 
" VLオブジェクトの取得に失敗しました." );
      }

    }


    
~Lisp ()
    
{
      Dispose();
    }


    
/// <summary>
    
/// VlApp によって使用されているリソースを開放します。
    
/// </summary>

    public void Dispose ()
    
{
      
if ( Disposed == false ) {
        m_vlFunc 
= null;
        m_vlObj 
= null;
        m_app 
= null;
        Disposed 
= true;
      }

    }


    
/// <summary>
    
/// COMオブジェクトからプロパティを取得します。
    
/// </summary>
    
/// <param name="obj">取得元のオブジェクト</param>
    
/// <param name="propName">プロパティ名</param>
    
/// <returns></returns>

    private object GetProperty ( object obj, string propName )
    
{
      
return obj.GetType().InvokeMember( propName,
        BindingFlags.GetProperty, 
null, obj, null );
    }


    
/// <summary>
    
/// COMオブジェクトからインデクサを取得します。
    
/// </summary>
    
/// <param name="obj">取得もとのオブジェクト</param>
    
/// <param name="index">インデックス名</param>
    
/// <returns></returns>

    private object GetIndexer ( object obj, string index )
    
{
      
return obj.GetType().InvokeMember( "Item",
        BindingFlags.GetProperty, 
null, obj, new object[] { index } );
    }


    
/// <summary>
    
/// LISP関数を呼び出し、結果を返します。
    
/// </summary>
    
/// <param name="funcName">LISP関数名</param>
    
/// <param name="args">引数</param>
    
/// <returns></returns>

    private object InvokeLispFunction ( string funcName, object[] args )
    
{
      
object sym = GetIndexer( m_vlFunc, funcName );
      
return sym.GetType().InvokeMember( "funcall",
        BindingFlags.InvokeMethod, 
null, sym, args );
    }


    
/// <summary>
    
/// LISP式を評価します。
    
/// </summary>
    
/// <param name="lispStatement">LISP式</param>
    
/// <returns></returns>

    public object Eval ( string lispStatement )
    
{
      
try {
        
object sym = InvokeLispFunction( "read"new object[] { lispStatement } );
        
return InvokeLispFunction( "eval"new object[] { sym } );
      }
 catch {
        AcEd.CommandLinePrompts.Message( 
" LISP式の評価に失敗しました." );
        
return null;
      }

    }


    
/// <summary>
    
/// LISP変数から値を取得します。
    
/// </summary>
    
/// <param name="symbolName">変数名</param>
    
/// <returns></returns>

    public object GetValue ( string symbolName )
    
{
      
try {
        
return Eval( symbolName );
      }
 catch {
        
return null;
      }

    }


    
/// <summary>
    
/// LISP変数に値を代入します。
    
/// </summary>
    
/// <param name="symbolName">変数名</param>
    
/// <param name="val"></param>

    public void SetValue ( string symbolName, object val )
    
{
      Eval( 
"(vl-load-com)" );
      Eval( 
"(defun translate-variant (data) (cond ((= (type data) 'list) (mapcar 'translate-variant data)) ((= (type data) 'variant) (translate-variant (vlax-variant-value data))) ((= (type data) 'safearray) (mapcar 'translate-variant (vlax-safearray->list data))) (t data)))" );
      Eval( 
"(setq " + symbolName + " (translate-variant " + val + "))" );
      Eval( 
"(setq translate-variant nil)" );
    }


    
/// <summary>
    
/// LISP変数にnilを代入します
    
/// </summary>
    
/// <param name="symbolName">変数名</param>

    public void SetSymbolsToNil ( params string[] symbolName )
    
{
      
for ( int i = 0; i < symbolName.Length; i++ ) {
        Eval( 
"(setq " + symbolName[ i ] + " nil)" );
      }

    }


    
/// <summary>
    
/// LISTをArrayListに変換します。
    
/// </summary>
    
/// <param name="symList">LISTの入った変数名</param>
    
/// <returns></returns>

    public ArrayList GetLispList ( string symList )
    
{
      ArrayList ret 
= new ArrayList();
      
object list;
      
long len;
      
try {
        list 
= Eval( symList );
        len 
= ( long )InvokeLispFunction( "length"new object[] { list } );
        
for ( long i = 0; i < len; i++ ) {
          ret.Add( InvokeLispFunction( 
"nth"new object[] { i, list } ) );
        }

      }
 catch {
      }

      
return ret;
    }


    
/// <summary>
    
/// DXFコードから情報を取得します。
    
/// </summary>
    
/// <param name="code">DXFコード</param>
    
/// <param name="symEname">図形名</param>
    
/// <returns></returns>

    private object getDxfData ( int code, object symEname )
    
{
      
object ent = InvokeLispFunction( "entget"new object[] { symEname } );
      
object val = InvokeLispFunction( "assoc"new object[] { code, ent } );
      
return InvokeLispFunction( "cdr"new object[] { val } );
    }


    
/// <summary>
    
/// LSIPの選択セットをAcadEntityの配列に変換します。
    
/// </summary>
    
/// <param name="symSS">選択セットの入っている変数名</param>
    
/// <param name="ents">AcadEntity配列の入れ物</param>
    
/// <returns></returns>

    public bool PickSetToSelectionSet ( string symSS, ref AcadEntity[] ents )
    
{
      
bool ret = false;
      
try {
        
object ss = Eval( symSS );
        
long sslength = ( long )InvokeLispFunction( "sslength"new object[] { ss } );
        ents 
= new AcadEntity[ sslength ];
        
for ( long i = 0; i < sslength; i++ ) {
          
object en = InvokeLispFunction( "ssname"new object[] { ss, i } );
          ents[ i ] 
= ( AcadEntity )( m_app.ActiveDocument.HandleToObject( ( string )getDxfData( 5, en ) ) );
        }

        ret 
= true;
      }
 catch {
      }

      
return ret;
    }


    
/// <summary>
    
/// LSIPの選択セットをActiveXの選択セットに変換します。
    
/// </summary>
    
/// <param name="symSS">選択セットの入っている変数名</param>
    
/// <param name="acadSS">AcadSelectionSetの入れ物</param>
    
/// <returns></returns>

    public bool PickSetToSelectionSet ( string symSS, ref AcadSelectionSet acadSS )
    
{
      
bool ret = false;
      acadSS.Clear();
      AcadEntity[] ents 
= null;
      
if ( PickSetToSelectionSet( symSS, ref ents ) ) {
        acadSS.AddItems( ents );
        ret 
= true;
      }

      
return ret;
    }


    
/// <summary>
    
/// LSIPの選択セットをObjectIdCollectionに変換します。
    
/// </summary>
    
/// <param name="symSS">選択セットの入っている変数名</param>
    
/// <param name="objIds">ObjectIdCollectionの入れ物</param>
    
/// <returns></returns>

    public bool PickSetToSelectionSet ( string symSS, ref AcDb.ObjectIdCollection objIds )
    
{
      
bool ret = false;
      objIds.Clear();
      AcadEntity[] ents 
= null;
      
if ( PickSetToSelectionSet( symSS, ref ents ) ) {
        
foreach ( AcadEntity en in ents ) {
          AcDb.ObjectId id 
= new AcDb.ObjectId();
          id.OldId 
= en.ObjectID;
          objIds.Add( id );
        }

        ret 
= true;
      }

      
return ret;
    }


    
/// <summary>
    
/// ObjectIdCollectionをLISPの選択セットに変換します。
    
/// </summary>
    
/// <param name="objIds">ObjectIdCollection</param>
    
/// <param name="symSS">選択セットを入れる変数名</param>
    
/// <returns></returns>

    public bool SelectionSetToPickSet ( AcDb.ObjectIdCollection objIds, string symSS )
    
{
      
bool ret = false;
      
try {
        Eval( 
"(setq " + symSS + " (ssadd))" );
        
foreach ( AcDb.ObjectId id in objIds )
          Eval( 
"(ssadd (handent "" + id.Handle + "")" + symSS + ")" );
        ret 
= true;
      }
 catch {
      }

      
return ret;
    }


    
/// <summary>
    
/// AcadSelectionSetをLISPの選択セットに変換します。
    
/// </summary>
    
/// <param name="acadDD">AcadSelectionSet</param>
    
/// <param name="symSS">選択セットを入れる変数名</param>
    
/// <returns></returns>

    public bool SelectionSetToPickSet ( AcadSelectionSet acadSS, string symSS )
    
{
      
bool ret = false;
      
try {
        Eval( 
"(setq " + symSS + " (ssadd))" );
        
foreach ( AcadEntity en in acadSS )
          Eval( 
"(ssadd (handent "" + en.Handle + "")" + symSS + ")" );
        ret 
= true;
      }
 catch {
      }

      
return ret;
    }

  }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AutoCAD Lisp是一种工具,它利用Lisp语言编写了一系列用于自动CAD软件扩展和定制的代码。 AutoCAD Lisp代码可以通过加载Lisp程序,向AutoCAD软件添加新的命令和功能。这些代码可以通过增加新的命令、修改现有命令或创建新的工具栏按钮来与AutoCAD软件进行交互。AutoCAD Lisp代码通常用于简化重复性的任务,提高设计师的工作效率。 AutoCAD Lisp代码具有以下一些常见的功能和应用: 1. 自定义命令:通过Lisp代码,我们可以编写自定义命令,以执行特定的任务或工作流程。例如,我们可以编写一个Lisp脚本,用于在AutoCAD创建特定型的图形模式,而不必手动绘制每个元素。 2. 修改命令行为:Lisp代码还可以用于修改现有的AutoCAD命令的行为。通常,AutoCAD的默认命令行为是通用的,但我们可能需要根据特定项目或需求来调整它们。通过编写Lisp代码,我们可以改变命令的默认行为,以满足我们的需求。 3. 自动化任务:Lisp代码还可以用于自动化执行一系列任务。例如,我们可以编写一个Lisp脚本,批量处理多个AutoCAD文件,而不必逐个文件进行操作。这种自动化可以显著提高工作效率和准确性。 4. 用户界面定制:Lisp代码还可以用于创建自定义的用户界面元素,例如工具栏按钮、菜单和对话框。通过Lisp代码,我们可以添加特定的功能或命令到自定义界面元素,以简化用户的操作。 总而言之,AutoCAD Lisp是一种强大的工具,用于扩展和定制AutoCAD软件。通过编写Lisp代码,我们可以定制命令、修改行为、自动化任务,并创建自定义用户界面元素,以提高AutoCAD设计师的工作效率。 ### 回答2: AutoCAD Lisp 是一种专门用于AutoCAD软件的编程语言,它能够扩展和自定义AutoCAD的功能。使用Lisp代码,我们可以创建自定义的命令,自动化常用的绘图操作,对图形进行修改和处理等。下面举一个简单的例子来说明: 假设我们需要在AutoCAD创建一个具有特定属性的图形,比如一个长方形。我们可以使用Lisp代码来完成这个任务。首先,我们定义一个新的命令,比如"CREATE_RECTANGLE",然后在代码实现相应的功能。 首先,我们需要获取用户输入的长和宽,并将其存储在相应的变量。然后,通过“command”函数调用AutoCAD的绘图命令“RECTANGLE”,并将用户输入的长和宽作为参数传入。接下来,我们使用“last”函数获取到刚刚绘制的长方形的实体对象,并将其存储在一个变量。 最后,我们可以通过使用属性操作函数来为这个长方形实体设置一些属性,比如颜色、线型等。这样,我们就完成了通过Lisp代码在AutoCAD创建一个具有特定属性的长方形的任务。 总而言之,AutoCAD Lisp一个强大的工具,它可以帮助我们实现各种自定义的功能和操作,从而提高AutoCAD软件的效率和灵活性。无论是简单的绘图操作还是复杂的图形处理,Lisp代码都可以帮助我们实现。只要我们熟悉这种语言的语法和函数,我们就可以自由发挥创造力,并实现各种个性化的需求。 ### 回答3: AutoCAD Lisp代码是一种用于AutoCAD软件的脚本语言,可以通过编写Lisp代码来自动完成一系列绘图操作。 Lisp代码由一系列的函数和表达式组成,在AutoCAD可以直接输入并执行。通过Lisp代码,我们可以实现诸如创建图形对象、修改图形属性、执行图形操作等功能。 举个例子,如果我们想要在AutoCAD创建一个圆形,我们可以编写如下的Lisp代码: ``` (defun c:create-circle () (setq center (getpoint "\nEnter center point: ")) (setq radius (getreal "\nEnter radius: ")) (command "circle" center radius) ) ``` 在这个例子,`defun`用于定义一个名为`c:create-circle`的函数,该函数用于创建一个圆形。`setq`用于设置变量的值,`getpoint`和`getreal`用于获取用户输入的点和半径。`command`用于执行AutoCAD的命令,这里我们使用了`circle`命令来创建圆形。 通过调用`c:create-circle`函数,我们可以在AutoCAD创建一个圆形。可以看到,通过编写Lisp代码,我们可以更加高效地完成一些重复性的绘图操作。 总而言之,AutoCAD Lisp代码是一种用于AutoCAD软件的脚本语言,通过编写Lisp代码,我们可以实现自动化的绘图操作,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值