找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3188|回复: 0

[分享] Synchronously Send (and wait for) commands in AutoCAD using C# .NET

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-26 23:18:19 | 显示全部楼层 |阅读模式

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

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

×
Synchronously Send (and wait for) commands in AutoCAD using C# .NET                                                        By Fenton Webb
I’m really sorry to say, but anyone who tells me that acedCommand() and acedCmd() are not good C++ functions for driving AutoCAD, are crazy! These functions have existed since the original R11 ADS development system in C and have always been used to synchronously send commands to the AutoCAD Command line. This means you can drive AutoCAD from your program code and expect things to be finished and done by the time the function returns.
These functions can literally save hours of work – instead of programmatically creating your own INSERT routine, just send the command and let AutoCAD do it – problem is, sometimes, you need to wait for the user to before carrying on, for example waiting for the user to place the block or enter the scales etc.
The code below shows how to PInvoke acedCmd() from .NET, and it shows the secret behind programmatically waiting for the user to finish the command using acedCmd(). Be warned though, we are changing/have changed the way these functions work, partly due to the AutoCAD for Mac port and now on Windows the Fiber removal project. Instead, you’ll need to use the acedCmdS() and acedCmdC() versions. Here’s some documentation on the subject
In the meantime, here’s the code showing how to call INSERT using acedCmd() synchronously
  1. // call the insert command and wait until the user has finished, by Fenton Webb, DevTech

  2. [DllImport("acad.exe", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedCmd")]
  3. private static extern int acedCmd(System.IntPtr vlist);
  4. [CommandMethod("Test7")]
  5. public void Test7()
  6. {
  7.   ResultBuffer rb = new ResultBuffer();
  8.   // RTSTR = 5005
  9.   rb.Add(new TypedValue(5005, "_.INSERT"));
  10.   // start the insert command
  11.   acedCmd(rb.UnmanagedObject);
  12.   bool quit = false;
  13.   // loop round while the insert command is active
  14.   while (!quit)
  15.   {
  16.     // see what commands are active
  17.     string cmdNames = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CMDNAMES");
  18.     // if the INSERT command is active
  19.     if (cmdNames.ToUpper().IndexOf("INSERT") >= 0)
  20.     {
  21.       // then send a PAUSE to the command line
  22.       rb = new ResultBuffer();
  23.       // RTSTR = 5005 - send a user pause to the command line
  24.       rb.Add(new TypedValue(5005, "\\"));
  25.       acedCmd(rb.UnmanagedObject);
  26.     }
  27.     else
  28.       // otherwise quit
  29.       quit = true;
  30.   }
  31. }


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

本版积分规则

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

GMT+8, 2024-11-17 22:47 , Processed in 0.171542 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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