如何等到 Acad 的实例运行后才创建新文档?
How to wait until an Acad's instance runs to create e new documents?
我正在使用 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 class 通过他的名字获取 The process,因为 Autocad window 尚未准备好,我无法创建 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中创建一个新文档,然后绘制网格。它有时有效,有时无效,当它有效时,它甚至会使用 CPU 的 50%。有时我得到这个例外。
我认为最好的方法是创建一个脚本 (.scr) 文件,您将定义该文件作为启动进程的参数,而不是在 [=21= 之前尝试等待 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 命令和任何相关值(如果您定义了它们),并在加载时 运行s 它们。将脚本作为参数加载到您的进程将自动使该脚本 运行.
这里是创建脚本的简要指南 - http://www.ellenfinkelstein.com/acadblog/tutorial-automate-tasks-with-a-script-file/
您也可以使用 AutoCAD 核心控制台执行此过程。它是 2013+ 版本中包含的 AutoCAD 版本,如果您想加快进程,运行 只能在命令行中使用 - http://through-the-interface.typepad.com/through_the_interface/2012/02/the-autocad-2013-core-console.html
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);
}
我正在使用 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 class 通过他的名字获取 The process,因为 Autocad window 尚未准备好,我无法创建 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中创建一个新文档,然后绘制网格。它有时有效,有时无效,当它有效时,它甚至会使用 CPU 的 50%。有时我得到这个例外。
我认为最好的方法是创建一个脚本 (.scr) 文件,您将定义该文件作为启动进程的参数,而不是在 [=21= 之前尝试等待 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 命令和任何相关值(如果您定义了它们),并在加载时 运行s 它们。将脚本作为参数加载到您的进程将自动使该脚本 运行.
这里是创建脚本的简要指南 - http://www.ellenfinkelstein.com/acadblog/tutorial-automate-tasks-with-a-script-file/
您也可以使用 AutoCAD 核心控制台执行此过程。它是 2013+ 版本中包含的 AutoCAD 版本,如果您想加快进程,运行 只能在命令行中使用 - http://through-the-interface.typepad.com/through_the_interface/2012/02/the-autocad-2013-core-console.html
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);
}