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
// call the insert command and wait until the user has finished, by Fenton Webb, DevTech
[DllImport("acad.exe", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedCmd")]
private static extern int acedCmd(System.IntPtr vlist);
[CommandMethod("Test7")]
public void Test7()
{
ResultBuffer rb = new ResultBuffer();
// RTSTR = 5005
rb.Add(new TypedValue(5005, "_.INSERT"));
// start the insert command
acedCmd(rb.UnmanagedObject);
bool quit = false;
// loop round while the insert command is active
while (!quit)
{
// see what commands are active
string cmdNames = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CMDNAMES");
// if the INSERT command is active
if (cmdNames.ToUpper().IndexOf("INSERT") >= 0)
{
// then send a PAUSE to the command line
rb = new ResultBuffer();
// RTSTR = 5005 - send a user pause to the command line
rb.Add(new TypedValue(5005, "\\"));
acedCmd(rb.UnmanagedObject);
}
else
// otherwise quit
quit = true;
}
}
Posted at 02:03 PM in Fenton Webb | Permalink
|
暂时没有评论
发表评论 - 不要忘了输入验证码哦! |