AutoCAD.Net/C#.Net QQ群:193522571 previewicon生成的块图标太小,CMLContentSearchPreviews生成大的图片
由于CMLContentSearchPreviews方法是AutoCAD2014中才加入的,所以只能应用于2014及以后版本,可惜啊!
using System.IO; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows.Data; namespace BlockPreviews { public class Commands { [CommandMethod("GBP", CommandFlags.Session)] public static void GenerateBlockPreviews() { var ed = Application.DocumentManager.MdiActiveDocument.Editor; var res = ed.GetFileNameForOpen("Select file for which to generate previews"); if (res.Status != PromptStatus.OK) return; string dwgname = res.StringResult; Document doc = null; try { doc = Application.DocumentManager.Open(dwgname, false); } catch { ed.WriteMessage("\nUnable to read drawing."); return; } var db = doc.Database; string path = Path.GetDirectoryName(dwgname), name = Path.GetFileName(dwgname), iconPath = path + "\\" + name + " icons"; int numIcons = 0; using (var tr = doc.TransactionManager.StartTransaction()) { var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); foreach (ObjectId btrId in bt) { var btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); // Ignore layouts and anonymous blocks if (btr.IsLayout || btr.IsAnonymous) continue; // Attempt to generate an icon, where one doesn't exist if (btr.PreviewIcon == null) { object ActiveDocument = doc.GetAcadDocument(); object[] data = { "_.BLOCKICON " + btr.Name + "\n" }; ActiveDocument.GetType().InvokeMember( "SendCommand", System.Reflection.BindingFlags.InvokeMethod, null, ActiveDocument, data ); } // Hopefully we now have an icon if (btr.PreviewIcon != null) { // Create the output directory, if it isn't yet there if (!Directory.Exists(iconPath)) Directory.CreateDirectory(iconPath); var fname = iconPath + "\\" + btr.Name + ".bmp"; // Delete the image if it already exists if (File.Exists(fname)) File.Delete(fname); // Save the icon to our out directory btr.PreviewIcon.Save(fname); // Increment our icon counter numIcons++; } } tr.Commit(); } doc.CloseAndDiscard(); ed.WriteMessage("\n{0} block icons saved to \"{1}\".", numIcons, iconPath); } [CommandMethod("GBP2")] public static void GenerateBlockPreviews2() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptFileNameResult res = ed.GetFileNameForOpen("Select file for which to generate previews"); if (res.Status != PromptStatus.OK) return; string dwgname = res.StringResult; int numIcons; string iconPath; // We don't need a document for access to the BlockTable using (var db = new Database(false, true)) { try { db.ReadDwgFile( dwgname, FileOpenMode.OpenForReadAndReadShare, true, "" ); } catch { ed.WriteMessage("\nUnable to read drawing."); return; } var path = Path.GetDirectoryName(dwgname); var name = Path.GetFileName(dwgname); iconPath = path + "\\" + name + " icons"; using (var tr = db.TransactionManager.StartTransaction()) { var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); numIcons = ExtractThumbnails(iconPath, tr, bt); tr.Commit(); } } ed.WriteMessage("\n{0} block icons saved to \"{1}\".", numIcons, iconPath); } [CommandMethod("GBPC")] public static void GenerateCurrentBlockPreviews() { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; var path = (string)Application.GetSystemVariable("DWGPREFIX"); var name = (string)Application.GetSystemVariable("DWGNAME"); var iconPath = path + name + " icons"; using (var tr = doc.TransactionManager.StartTransaction()) { var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); int numIcons = ExtractThumbnails(iconPath, tr, bt); tr.Commit(); ed.WriteMessage("\n{0} block icons saved to \"{1}\".", numIcons, iconPath); } } private static int ExtractThumbnails(string iconPath, Transaction tr, BlockTable bt) { int numIcons = 0; foreach (ObjectId btrId in bt) { var btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); // Ignore layouts and anonymous blocks if (btr.IsLayout || btr.IsAnonymous) continue; // Attempt to generate an icon, where one doesn't exist { // Create the output directory, if it isn't yet there if (!Directory.Exists(iconPath)) Directory.CreateDirectory(iconPath); // Save the icon to our out directory var imgsrc = CMLContentSearchPreviews.GetBlockTRThumbnail(btr); var bmp = ImageSourceToGDI(imgsrc as System.Windows.Media.Imaging.BitmapSource); var fname = iconPath + "\\" + btr.Name + ".bmp"; if (File.Exists(fname)) File.Delete(fname); bmp.Save(fname); // Increment our icon counter numIcons++; } } return numIcons; } // Helper function to generate an Image from a BitmapSource private static System.Drawing.Image ImageSourceToGDI(System.Windows.Media.Imaging.BitmapSource src ) { var ms = new MemoryStream(); var encoder = new System.Windows.Media.Imaging.BmpBitmapEncoder(); encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(src)); encoder.Save(ms); ms.Flush(); return System.Drawing.Image.FromStream(ms); } } }