马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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;
- }
- }
|