找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1667|回复: 0

[分享] InvokeARX.cs

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-4 14:37:55 | 显示全部楼层 |阅读模式

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

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

×
  1. using System;
  2. using System.Windows;
  3. using System.Reflection;
  4. using System.Runtime.InteropServices;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.ApplicationServices;
  10. namespace WlanDesignDll
  11. {
  12.     class InvokeArx
  13.     {
  14.         private static void AddValueToResultBuffer(ref ResultBuffer rb, object obj)
  15.         {
  16.             if (obj == null)
  17.             {
  18.                 rb.Add(new TypedValue((int)LispDataType.Text, ""));
  19.             }
  20.             else
  21.             {
  22.                 if (obj is string)
  23.                 {
  24.                     rb.Add(new TypedValue((int)LispDataType.Text, obj));
  25.                 }
  26.                 else if (obj is Point2d)
  27.                 {
  28.                     rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
  29.                     rb.Add(new TypedValue((int)LispDataType.Point2d, obj));
  30.                 }
  31.                 else if (obj is Point3d)
  32.                 {
  33.                     rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
  34.                     rb.Add(new TypedValue((int)LispDataType.Point3d, obj));
  35.                 }
  36.                 else if (obj is ObjectId)
  37.                 {
  38.                     rb.Add(new TypedValue((int)LispDataType.ObjectId, obj));
  39.                 }
  40.                 else if (obj is SelectionSet)
  41.                 {
  42.                     rb.Add(new TypedValue((int)LispDataType.SelectionSet, obj));
  43.                 }
  44.                 else if (obj is double)
  45.                 {
  46.                     rb.Add(new TypedValue((int)LispDataType.Double, obj));
  47.                 }
  48.                 else if (obj is short)
  49.                 {
  50.                     rb.Add(new TypedValue((int)LispDataType.Int16, obj));
  51.                 }
  52.                 else if (obj is int)
  53.                 {
  54.                     rb.Add(new TypedValue((int)LispDataType.Int32, obj));
  55.                 }
  56.                 else if (obj is TypedValue)
  57.                 {
  58.                     rb.Add(obj);
  59.                 }
  60.             }
  61.         }
  62.         #region Redraw
  63.         [System.Security.SuppressUnmanagedCodeSecurity]
  64.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  65.         private static extern Int32 acedRedraw(long[] name, Int32 mode);
  66.         public static void Redraw()
  67.         {
  68.             acedRedraw(null, 1);
  69.         }
  70.         //[DllImport("acdb17.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acdbGetAdsName@@YA?AW4ErrorStatus@Acad@@AAY01JVAcDbObjectId@@@Z")]
  71.         //private static extern int acdbGetAdsName(long[] name, ObjectId objId);
  72.         //public static void Redraw(ObjectId id)
  73.         //{
  74.         //    long[] adsname = new long[2];
  75.         //    acdbGetAdsName(adsname, id);
  76.         //    acedRedraw(adsname, 1);
  77.         //}
  78.         #endregion
  79.         #region TextScr
  80.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  81.         private static extern int acedTextScr();
  82.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  83.         private static extern int acedGraphScr();
  84.         public static bool DisplayTextScreen
  85.         {
  86.             set
  87.             {
  88.                 if (value)
  89.                     acedTextScr();
  90.                 else
  91.                     acedGraphScr();
  92.             }
  93.         }
  94.         #endregion
  95.         #region Command
  96.         /// <summary>
  97.         /// 控制命令行回显
  98.         /// </summary>
  99.         public static bool CmdEcho
  100.         {
  101.             get
  102.             {
  103.                 return (int)Application.GetSystemVariable("cmdecho") == 1;
  104.             }
  105.             set
  106.             {
  107.                 Application.SetSystemVariable("cmdecho", Convert.ToInt16(value));
  108.             }
  109.         }
  110.         [DllImport("acad.exe")]
  111.         private static extern int acedCmd(IntPtr vlist);

  112.         /// <summary>
  113.         /// 调用AutoCad命令
  114.         /// </summary>
  115.         /// <param name="prompt">命令行提示</param>
  116.         /// <param name="arg">参数</param>
  117.         public static void Command(string prompt, object arg)
  118.         {
  119.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(prompt);
  120.             //System.Windows.Forms.MessageBox.Show(prompt);

  121.             ResultBuffer rb = new ResultBuffer();
  122.             AddValueToResultBuffer(ref rb, arg);
  123.             try
  124.             {
  125.                 acedCmd(rb.UnmanagedObject);
  126.             }
  127.             catch { }
  128.             finally
  129.             {
  130.                 rb.Dispose();
  131.             }
  132.         }
  133.         /// <summary>
  134.         /// 调用AutoCad命令
  135.         /// </summary>
  136.         /// <param name="endCommandByUser">命令结束方式</param>
  137.         /// <param name="ldnode">参数</param>
  138.         public static void Command(bool endCommandByUser, ResultBuffer rb)
  139.         {
  140.             ResultBuffer rbend = new ResultBuffer();
  141.             try
  142.             {
  143.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  144.                 string currCmdName = doc.CommandInProgress;
  145.                 acedCmd(rb.UnmanagedObject);
  146.                 if (endCommandByUser)
  147.                 {
  148.                     rbend.Add(new TypedValue((int)LispDataType.Text, "\\"));
  149.                 }
  150.                 while (doc.CommandInProgress != currCmdName)
  151.                 {
  152.                     acedCmd(rbend.UnmanagedObject);
  153.                 }
  154.             }
  155.             catch { }
  156.             finally
  157.             {
  158.                 rb.Dispose();
  159.                 rbend.Dispose();
  160.             }
  161.         }
  162.         /// <summary>
  163.         /// 调用AutoCad命令
  164.         /// </summary>
  165.         /// <param name="endCommandByUser">命令结束方式</param>
  166.         /// <param name="args">参数</param>
  167.         public static void Command(bool endCommandByUser, params object[] args)
  168.         {
  169.             ResultBuffer rb = new ResultBuffer();
  170.             ResultBuffer rbend = new ResultBuffer();
  171.             foreach (object val in args)
  172.             {
  173.                 AddValueToResultBuffer(ref rb, val);
  174.             }
  175.             try
  176.             {
  177.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  178.                 string currCmdName = doc.CommandInProgress;
  179.                 acedCmd(rb.UnmanagedObject);
  180.                 if (endCommandByUser)
  181.                 {
  182.                     rbend.Add(new TypedValue((int)LispDataType.Text, "\\"));
  183.                 }
  184.                 while (doc.CommandInProgress != currCmdName)
  185.                 {
  186.                     acedCmd(rbend.UnmanagedObject);
  187.                 }
  188.             }
  189.             catch { }
  190.             finally
  191.             {
  192.                 rb.Dispose();
  193.                 rbend.Dispose();
  194.             }
  195.         }
  196.         #endregion

  197.         #region Lisp
  198.         [System.Security.SuppressUnmanagedCodeSecurity]
  199.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  200.         extern static private int acedPutSym(string name, IntPtr result);
  201.         [System.Security.SuppressUnmanagedCodeSecurity]
  202.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  203.         extern static private int acedGetSym(string name, out IntPtr result);
  204.         [System.Security.SuppressUnmanagedCodeSecurity]
  205.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  206.         extern static private int acedInvoke(IntPtr args, out IntPtr result);
  207.         public static ResultBuffer CallLispFunction(ResultBuffer args)
  208.         {
  209.             IntPtr ip = IntPtr.Zero;
  210.             int st = acedInvoke(args.UnmanagedObject, out ip);
  211.             if (ip != IntPtr.Zero)
  212.             {
  213.                 ResultBuffer rbRes = ResultBuffer.Create(ip, true);
  214.                 return rbRes;
  215.             }
  216.             return null;
  217.         }
  218.         public static ResultBuffer CallLispFunction(string name, params object[] args)
  219.         {
  220.             ResultBuffer rbArgs = new ResultBuffer();
  221.             rbArgs.Add(new TypedValue((int)LispDataType.Text, name));
  222.             foreach (object val in args)
  223.             {
  224.                 AddValueToResultBuffer(ref rbArgs, val);
  225.             }
  226.             return CallLispFunction(rbArgs);
  227.         }

  228.         internal static ResultBuffer GetLispSym(string name)
  229.         {
  230.             IntPtr ip = IntPtr.Zero;
  231.             acedGetSym(name, out ip);
  232.             if (ip != IntPtr.Zero)
  233.             {
  234.                 ResultBuffer rbRes = ResultBuffer.Create(ip, true);
  235.                 return rbRes;
  236.             }
  237.             return null;
  238.         }
  239.         #endregion
  240.     }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-18 23:38 , Processed in 0.399348 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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