Как дождаться запуска экземпляра Acad для создания новых документов?
Я использую objectARX и пытаюсь создать новый документ. Сначала я запускаю AutoCad.
Process acadApp = new Process();
acadApp.StartInfo.FileName = "C:/Program Files/Autodesk/AutoCAD 2015/acad.exe";
acadApp.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
acadApp.Start();
Тогда проблема в том, когда я жду, пока экземпляр Acad не будет готов. Я не могу получить процесс по его имени с классом Process, потому что окно Autocad еще не готово, и я не могу создать экземпляр AcadApplication. Работает только когда Autocad полностью загружен, поэтому я использую.
bool checkInstance = true;
//This piece of pure shit listen for an Acad instnce until this is opened
while (checkInstance)
{
try
{
var checkinstance = Marshal.GetActiveObject("AutoCAD.Application");
checkInstance = false;
}
catch (Exception ex)
{
}
}
//Once the acad instance is opende The show starts
Thread.Sleep(12000);
Thread jili2 = new Thread(new ThreadStart(() => acadG.AcadGrid(Convert.ToInt32(grid.floorHeight), Convert.ToInt32(grid.floorWidth), grid.numFloors)));
jili2.Start();
// MessageBox.Show("I don't know why it was executed");
}
Метод acadGrid, запущенный в потоке, создает новый документ в AutoCad, а затем рисует сетку. Иногда он работает, а иногда нет, а когда он работает, он использует даже 50% процессорного времени. Иногда я получаю это исключение.
2 ответа
Process.WaitForInputIdle
а также Application.GetAcadState
может помочь:
Process acadProc = new Process();
acadProc.StartInfo.FileName = "C:/Program Files/Autodesk/AutoCAD 2015/acad.exe";
acadProc.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
acadProc.Start();
if (!acadProc.WaitForInputIdle(300000))
throw new ApplicationException("Acad takes too much time to start.");
AcadApplication acadApp;
while (true)
{
try
{
acadApp = Marshal.GetActiveObject("AutoCAD.Application.20");
return;
}
catch (COMException ex)
{
const uint MK_E_UNAVAILABLE = 0x800401e3;
if ((uint) ex.ErrorCode != MK_E_UNAVAILABLE) throw;
Thread.Sleep(1000);
}
}
while (true)
{
AcadState state = acadApp.GetAcadState();
if (state.IsQuiescent) break;
Thread.Sleep(1000);
}
Я полагаю, что лучшим способом было бы создать файл сценария (.scr), который вы определите в качестве параметра для запуска вашего процесса, а не пытаться ждать загрузки AutoCAD до запуска вашей процедуры.
// Build parameters.
StringBuilder param = new StringBuilder();
string exportScript = @"C:\script.scr";
if (!string.IsNullOrWhiteSpace(exportScript))
{ param.AppendFormat(" /s \"{0}\"", exportScript); }
// Create Process & set the parameters.
Process acadProcess = new Process();
acadProcess.StartInfo.FileName = AcadExePath;
acadProcess.StartInfo.Arguments = param.ToString();
acadProcess.Start();
Файл сценария - это основной текстовый файл, в котором перечислены команды AutoCAD и любые соответствующие значения, если вы их определяете, и запускаете их при загрузке. Загрузка скрипта в качестве параметра в ваш процесс автоматически запустит этот скрипт.
Вот краткое руководство по созданию сценариев - http://www.ellenfinkelstein.com/acadblog/tutorial-automate-tasks-with-a-script-file/
Вы также можете сделать этот процесс с помощью AutoCAD Core Console. Это версия AutoCAD, включенная в версии 2013+, которая работает исключительно в командной строке, если вы хотите ускорить процесс - http://through-the-interface.typepad.com/through_the_interface/2012/02/the-autocad-2013-core-console.html