- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- namespace CurrentDirectory
- {
- public class Commands
- {
- [CommandMethod("CURDIR")]
- public void GetCurrentDirectory()
- {
- Document doc =
- Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- ed.WriteMessage(
- "\nSystem.Environment.CurrentDirectory: "
- + System.Environment.CurrentDirectory
- + "\nSystem.IO.Directory.GetCurrentDirectory(): "
- + System.IO.Directory.GetCurrentDirectory()
- );
- }
- }
- }
复制代码上面的代码能很好的运行,但它并不能返回我们所想要的结果:命令执行时,模块是如何加载的。如果我们使用“命令加载”来加载模块,模块运行足够早的话,通常情况下会返回我们期望的结果。
下面是在修改过快捷方式的AutoCAD 实例中,执行CURDIR命令加载我们的模块时所返回的结果:
Command: curdir
System.Environment.CurrentDirectory: C:\temp
System.IO.Directory.GetCurrentDirectory(): C:\temp
另一方面,如果我们使用NETLOAD命令来加载我们的模块,就可以得到所加载模块的目录:
Command: netload
Command: curdir
System.Environment.CurrentDirectory: C:\Program Files\Autodesk\ObjectARX
2008\samples\dotNet\Prompts\bin\Debug
System.IO.Directory.GetCurrentDirectory(): C:\Program Files\Autodesk\ObjectARX
2008\samples\dotNet\Prompts\bin\Debug
这花费我了不少时间来思考所发生的问题: AutoCAD中标准的“文件导航”对话框,不管是在打开一张图纸文件,加载一个应用,还是对另一种类型的文件执行一种操作时-打开的当前目录为其最近操作的目录,即第一次运行和关闭时的文档位置。所以即使你没有执行过“打开”命令,你所浏览过的目录(不包括进行取消操作的目录)也会成为新的当前目录。
不管这个结果是否直观或者是在预料之中的,这都不是我真正想说的(尽管我理解为什么大家会对此有意见)。这篇文章的真正寓意是获取的AutoCAD(或实际中的其他复杂应用 )的“起始位置”并不是十分可靠,除非在执行过程中及早进行获取。因为进程中的代码在需要时就会对设置进行修改。
尽管不是100% 可靠 – 并不能确保一些别的代码并没有提前对此特性进行了修改- 确认“起始位置”的最好时机是在AutoCAD启动并加载一个模块时。