« Microbenchmarking C# code | Main | Creating an AutoCAD linetype programmatically using .NET »
Launching AutoCAD with a specific profile using .NET
This is a follow-up to this previous post, where we used COM to launch the AutoCAD process. Tony Tanzillo rightly pointed out the code in that post could be simplified slightly, so check out his comment for the specifics.
Today we're going to look at launching AutoCAD more manually, allowing us to control the working folder and specify command-line parameters. This is to address the specific question of choosing an alternative startup profile for the application, but AutoCAD's command-line parameters allow you to do a great deal more than that.
We're going to use the System.Diagnostics namespace to specify our options and launch our process, and then use COM to connect to it (so we can use the COM Automation API, as before, to run commands, etc.).
Here are the namespace declarations:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Interop;
And here's the C# code to implement your function or button message-handler:
const string progID = "AutoCAD.Application.17.1";
// The @ means it's a literal string - no need
// for double backslashes
const string exePath =
@"c:\Program Files\Autodesk\AutoCAD 2008\acad.exe";
AcadApplication acApp = null;
// Let's first check we don't have AutoCAD already running
try
{
acApp =
(AcadApplication)Marshal.GetActiveObject(progID);
}
catch {}
if (acApp != null)
{
MessageBox.Show(
"An instance of AutoCAD is already running."
);
}
else
{
try
{
// Use classes from the System.Diagnostics namespace
// to launch our AutoCAD process with command-line
// options
ProcessStartInfo psi =
new ProcessStartInfo(exePath, "/p myprofile");
psi.WorkingDirectory = @"c:\temp";
Process pr = Process.Start(psi);
// Wait for AutoCAD to be ready for input
// This doesn't wait until AutoCAD is ready
// to receive COM requests, it seems
pr.WaitForInputIdle();
// Connect to our process using COM
// We're going to loop infinitely until we get the
// AutoCAD object.
// A little risky, unless we implement a timeout
// mechanism or let the user cancel
while (acApp == null)
{
try
{
acApp =
(AcadApplication)Marshal.GetActiveObject(progID);
}
catch
{
// Let's let the application check its message
// loop, in case the user has exited or cancelled
Application.DoEvents();
}
}
}
catch (Exception ex)
{
MessageBox.Show(
"Cannot create or attach to AutoCAD object: "
+ ex.Message
);
}
}
if (acApp != null)
{
acApp.Visible = true;
acApp.ActiveDocument.SendCommand("_MYCOMMAND ");
}
Well, that's it for 2007. A Happy Holidays to you all, and a Merry Christmas & Happy New Year to those of you who celebrate these events.
See you in 2008!
December 21, 2007 in AutoCAD, AutoCAD .NET | Permalink
TrackBack
TrackBack URL for this entry:
http://www.typepad.com/t/trackback/876965/24406724
Listed below are links to weblogs that reference Launching AutoCAD with a specific profile using .NET:
Comments
Hi Kaen,
The article is extremely useful and thanks for the same.
However, I wanted to find out if the process is ready to receive COM inputs?
As you have mentioned here ..."This doesn't wait until AutoCAD is ready to receive COM requests, it seems"!! Can I find out the busy state of AutoCAD?
Regards,
Manoj
Posted by: Manoj | Apr 23, 2008 9:52:46 AM
Hi Manoj,
That's why we're looping until we get the COM object: if AutoCAD was ready to answer a question about whether it was busy or not, by definition it would no longer be busy! :-)
Kean
Posted by: Kean | Apr 23, 2008 10:32:46 AM
Hi Kean,
Thanks for this post.
Is it possible to launch AutoCAD in two different sessions?
Actually I tried to create another instance of AutoCAD, but it is throwing error as Another AutoCAD session is running. My requirement is that another AutoCAD session need to be opened without disturbing previous one. Can I open another AutoCAD session without closing previous session?
Posted by: Senthilkumar | May 6, 2008 12:05:36 PM
You can usually launch up to two sessions of AutoCAD. The problem you'll have is connecting to the second one: GetActiveObject() is likely to always return the first in the ROT (Running Object Table).
It can probably be worked around, but it won't be straightforward.
Kean
Posted by: Kean | May 6, 2008 1:42:34 PM
Thanks for you reply. I am able to launch the AutoCAD application and setting the AutoCAD window as child window in my application. I want to disable the close button ( X ) in the AutoCAD window. Is it possible to disable? if yes, can you please provide the details?
Posted by: Senthilkumar | May 6, 2008 5:09:03 PM
You can simply UNDEFINE QUIT.
Regards,
Kean
Posted by: Kean | May 6, 2008 9:13:06 PM

Atom