Here is the final code I ended up with if anybody is interested:
using System;
using System.IO;
using System.Text;
using Autodesk.AutoCAD.Windows;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using ofdFlags = Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags;
using sfdFlags = Autodesk.AutoCAD.Windows.SaveFileDialog.SaveFileDialogFlags;
namespace CGabriel
{
public class LispFileDialogs
{
public static string title;
public static string defaultFileName;
public static string defaultExtension;
public static short flags;
[LispFunction("GetOpenFileDialog")]
public static ResultBuffer GetOpenFileDialog(ResultBuffer args)
{
if (!parseArguments(args)) return null;
ofdFlags dlgFlags = (ofdFlags)flags;
if (((dlgFlags & ofdFlags.DefaultIsFolder) != 0) && Path.HasExtension(defaultFileName))
defaultFileName = Path.GetDirectoryName(defaultFileName);
OpenFileDialog dlg = new OpenFileDialog(title, defaultFileName, defaultExtension, title, dlgFlags);
if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
return null;
ResultBuffer result = new ResultBuffer();
foreach (string file in dlg.GetFilenames())
result.Add(new TypedValue((int)LispDataType.Text, file));
return result;
}
[LispFunction("GetSaveFileDialog")]
public static TypedValue GetSaveFileDialog(ResultBuffer args)
{
if (!parseArguments(args))
return new TypedValue((int)LispDataType.Nil, null);
sfdFlags dlgFlags = (sfdFlags)flags;
if (((dlgFlags & sfdFlags.DefaultIsFolder) != 0) && Path.HasExtension(defaultFileName))
defaultFileName = Path.GetDirectoryName(defaultFileName);
SaveFileDialog dlg = new SaveFileDialog(title, defaultFileName, defaultExtension, title, dlgFlags);
if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
return new TypedValue((int)LispDataType.Nil, null);
return new TypedValue((int)LispDataType.Text, dlg.Filename);
}
public static bool parseArguments(ResultBuffer args)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
if (args == null)
return notEnoughArguments(ed);
ResultBufferEnumerator iter = args.GetEnumerator();
iter.MoveNext();
if (iter.Current.TypeCode != (short)LispDataType.Text)
return wrongArguments(ed);
title = (string)iter.Current.Value;
if (iter.MoveNext() == false)
return notEnoughArguments(ed);
if (iter.Current.TypeCode != (short)LispDataType.Text)
return wrongArguments(ed);
defaultFileName = (string)iter.Current.Value;
if (iter.MoveNext() == false)
return notEnoughArguments(ed);
if (iter.Current.TypeCode != (short)LispDataType.Text)
return wrongArguments(ed);
defaultExtension = (string)iter.Current.Value;
if (iter.MoveNext() == false)
return notEnoughArguments(ed);
if (iter.Current.TypeCode != (short)LispDataType.Int16)
return wrongArguments(ed);
flags = (short)iter.Current.Value;
return true;
}
public static bool notEnoughArguments(Editor ed)
{
ed.WriteMessage("\nToo few arguments.");
return false;
}
public static bool wrongArguments(Editor ed)
{
ed.WriteMessage("\nExpected string string string int.");
return false;
}
}
}
There are a couple of reasons I did this.
1) I've had getfiled return bogus results.
2) It wanted the ability to select multiple files like dos_getfilem, but with the drawing preview in the file dialog like getfiled.
I hope somebody finds it useful.