Issue
AutoCAD のユーザー インターフェース上に開いている現在のアクティブな図面(MDI 子ウィンドウにフォーカスが当たっている表示中の図面)を Database.SaveAs(string, DwgVersion) メソッドで保存しようとしても、図面ウィンドウ上の図面タイトルが指定した名前に変化しません。
SAVEAS コマンドと同等の挙動を実現したいのですが、どうすればいいでしょうか?
Solution
Database.SaveAs メソッドには、次の3つのオーバロード メソッドが用意されています。
Database.SaveAs(string, Autodesk.AutoCAD.DatabaseServices.SecurityParameters)
Database.SaveAs(string, DwgVersion) Method | Autodesk
Database.SaveAs(string, [MarshalAs(UnmanagedType.U1)] bool, DwgVersion, Autodesk.AutoCAD.DatabaseServices.SecurityParameters)
あいにく、いずれのオーバロード メソッドも SAVEAS コマンドに対応した動作を完全に実現するものではなく、同コマンドの実装の一部分を担う機能しか実装されていない状態です。
図面ウィンドウ上の図面タイトルが指定した名前を反映させる方法として Database.SaveAs(string, [MarshalAs(UnmanagedType.U1)] bool, DwgVersion, Autodesk.AutoCAD.DatabaseServices.SecurityParameters) のオーバーロード バージョンの第2パラメーターを true を指定する方法があります。ただし、この方法も SAVEAS コマンドと同等の動作をするものではありません。
完全に SAVEAS コマンドと同じ挙動を得るには、SAVEAS コマンドをそのまま呼び出す必要があります。
次の例は、Editor.Command メソッドで SAVEAS コマンドを呼び出すものです。
[CommandMethod("MyCommand1", CommandFlags.Modal)]
public void MyCommand1()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
if (doc != null)
{
string path = @"C:\temp\Test.dwg";
int filedia = System.Convert.ToInt32(Application.GetSystemVariable("FILEDIA"));
Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("FILEDIA", 0);
if (System.IO.File.Exists(path))
{
ed.WriteMessage("\n指定したフォルダに同じ名前の図面ファイルが既に存在しています");
string check_path = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGPREFIX").ToString();
check_path = check_path + Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DWGNAME").ToString();
if (path == check_path)
{
ed.WriteMessage("\n開いている同じ名前の図面ファイルで上書きします...");
ed.Command("SAVEAS", "2018", path);
}
else
{
ed.WriteMessage("\n開いている図面で上書きします...");
ed.Command("SAVEAS", "2018", path, "Y");
}
}
else
{
ed.WriteMessage("\n指定したフォルダに初めて指定した名前で図面ファイルを保存します...");
ed.Command("SAVEAS", "2018", path);
}
Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("FILEDIA", filedia);
}
}
通常の SAVEAS コマンドでは、保存先のパスとファイル名を指定する際にファイル ダイアログが表示されてしまうので、FILEDIA システム変数でその表示を抑止しています。また、保存先のパスに同じファイル名の図面が存在した場合、アクティブな現在の図面の状態によって上書き保存の可否を指定するプロンプト オプションが異なるため注意が必要です。
記事全体を表示