如何在Autocad中使用C#关闭文件以保持acad.exe运行?
我正在使用visual studio 2010,我有一个.DWG文件,我想在autocad中打开它。到现在为止,我一直用这个如何在Autocad中使用C#关闭文件以保持acad.exe运行?,c#,file,autocad,C#,File,Autocad,我正在使用visual studio 2010,我有一个.DWG文件,我想在autocad中打开它。到现在为止,我一直用这个 Process p = new Process(); ProcessStartInfo s = new ProcessStartInfo("D:/Test File/" + fileName); p.StartInfo = s; p.Start(); 但是我想要的是关闭Autocad内部的文件,而不是Autocad本身。(意味着atocad.exe应保持运行) 到目前为
Process p = new Process();
ProcessStartInfo s = new ProcessStartInfo("D:/Test File/" + fileName);
p.StartInfo = s;
p.Start();
但是我想要的是关闭Autocad内部的文件,而不是Autocad本身。(意味着atocad.exe应保持运行)
到目前为止,我一直使用这个,但它关闭acad.exe而不是文件
foreach (Process Proc in Process.GetProcesses())
{
if (Proc.ProcessName.Equals("acad"))
{
Proc.CloseMainWindow();
Proc.Kill();
}
}
我怀疑您能否做到这一点,除非AutoCAD有一个API,您可以连接到该API并要求它为您关闭该文件
您的c#应用程序只能对进程(acad.exe)执行操作,它无权访问该进程的内部操作 从Autodesk站点()获取Autocad.NET库 然后您将能够使用
应用程序
和文档
类。
它们将使您能够完全控制应用程序中的打开和关闭文档
您可以找到许多关于这方面的文章,并可以提出进一步的问题。此外,您不应该使用Kill,除非进程没有响应,而且肯定不会在关闭MainWindow后立即使用
CloseMainWindow是要求应用程序自行关闭的礼貌方式。杀戮就像从插座中拔出电源线。您没有给它一个清理自身并干净地退出的机会。还有一种可能性-只有当您的C#代码与AutoCAD进程在同一台机器上运行时,这才有效,并且不建议您这样做,但是,如果您真的陷入困境并准备忍受窗口切换的麻烦,您可以使用SendKeys命令向应用程序发送按键 MSDN文章如下:
使用此选项,您可以发送按键以模拟用户使用菜单命令关闭文件 AutoCAD确实有一个api。有4个议会。两个用于进程中,两个用于COM
foreach (Process Proc in Process.GetProcesses())
{
if (Proc.ProcessName.Equals("acad"))
{
Proc.CloseMainWindow();
Proc.Kill();
}
}
进程内:
acdbmgd.dll
acmgd.dll
共产国际:
Autodesk.Autocad.Interop.dll
Autodesk.Autocad.Interop.Common.dll
此方法将打开新的AutoCAD实例,或连接到现有正在运行的AutoCAD实例
您需要将这些.dll加载到项目引用中
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
namespace YourNameSpace {
public class YourClass {
AcadApplication AcApp;
private const string progID = "AutoCAD.Application.18.2";// this is AutoCAD 2012 program id
private string profileName = "<<Unnamed Profile>>";
private const string acadPath = @"C:\Program Files\Autodesk\AutoCAD 2012 - English\acad.exe";
public void GetAcApp()
{
try
{
AcApp = (AcadApplication)Marshal.GetActiveObject(progID);
} catch {
try {
var acadProcess = new Process();
acadProcess.StartInfo.Arguments = string.Format("/nologo /p \"{0}\"", profileName);
acadProcess.StartInfo.FileName = (@acadPath);
acadProcess.Start();
while(AcApp == null)
{
try { AcApp = (AcadApplication)Marshal.GetActiveObject(progID); }
catch { }
}
} catch(COMException) {
MessageBox.Show(String.Format("Cannot create object of type \"{0}\"",progID));
}
}
try {
int i = 0;
var appState = AcApp.GetAcadState();
while (!appState.IsQuiescent)
{
if(i == 120)
{
Application.Exit();
}
// Wait .25s
Thread.Sleep(250);
i++;
}
if(AcApp != null){
// set visibility
AcApp.Visible = true;
}
} catch (COMException err) {
if(err.ErrorCode.ToString() == "-2147417846"){
Thread.Sleep(5000);
}
}
}
}
}
请原谅我的密码。这太糟糕了,这是我刚开始开发…时的第一个方法。要执行文件关闭,最好的方法是按照这里的步骤,用下面的代码更改下面的代码
[CommandMethod("CD", CommandFlags.Session)]
static public void CloseDocuments()
{
DocumentCollection docs = Application.DocumentManager;
foreach (Document doc in docs)
{
// First cancel any running command
if (doc.CommandInProgress != "" &&
doc.CommandInProgress != "CD")
{
AcadDocument oDoc =
(AcadDocument)doc.AcadDocument;
oDoc.SendCommand("\x03\x03");
}
if (doc.IsReadOnly)
{
doc.CloseAndDiscard();
}
else
{
// Activate the document, so we can check DBMOD
if (docs.MdiActiveDocument != doc)
{
docs.MdiActiveDocument = doc;
}
int isModified =
System.Convert.ToInt32(
Application.GetSystemVariable("DBMOD")
);
// No need to save if not modified
if (isModified == 0)
{
doc.CloseAndDiscard();
}
else
{
// This may create documents in strange places
doc.CloseAndSave(doc.Name);
}
}
}
任何代码都是非常有用的,因为我在过去几个小时里一直在努力,但都是徒劳的。谢谢你……几分钟的搜索让我想到了这一点,这看起来是一个很好的开始:我认为你没有什么可以做的。您可以立即重新启动该进程,以便为下一个文件做好准备。我正在处理它,它只是在打开文件时出现了一个无休止的异常“WindowsFormsApplication1.exe中出现了“System.InvalidCastException”类型的第一次意外异常”Trae Moore完全正确。COMInterop界面完成了这项工作。只需确保使用正确的平台dll(win-32或x64),它就像魔术一样工作,不需要做很多事情。。刚输入一行,它就可以工作了。谢谢。:-:-:-):-:-):-)行是SendKeys.SendWait(“^{F4}”);检查答案并尝试一下,毫无疑问这是一个更好的选择,我最终使用了它。