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);
}
}
}

AutoCAD.Net/C#.Net QQ群:193522571
previewicon生成的块图标太小,CMLContentSearchPreviews生成大的图片,布布扣,bubuko.com

AutoCAD.Net/C#.Net QQ群:193522571
previewicon生成的块图标太小,CMLContentSearchPreviews生成大的图片

时间: 2024-10-11 00:26:03

AutoCAD.Net/C#.Net QQ群:193522571 previewicon生成的块图标太小,CMLContentSearchPreviews生成大的图片的相关文章

AutoCAD.Net/C#.Net QQ群:193522571 删除编组(group) 尺寸线(dimension)

public void deleteDimension() { //定义数据库 Database db = HostApplicationServices.WorkingDatabase; //获取当前文件 Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; //获取当前命令行对象 Editor ed = Autodesk.AutoCAD.Applic

AutoCAD.Net/C#.Net QQ群:193522571 多个框架共一套代码在进行迁移时的问题,properties,resource,未能加载文件或程序集“System.Drawing, Version=4.0.0.0

此时在3.5框架工程中会出现 [未能加载文件或程序集“System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项.系统找不到指定的文件. 行 123,位置 5.] 的错误,解决办法是将4.0.0.0改成2.0.0.0.如下面的代码. 另外,在namespace进行了修改后需要将“原命名空间.properties.resource ”改成“现在的命名空间.properties

AutoCAD.Net/C#.Net QQ群:193522571 System.Drawing.Color和AutoDesk.AutoCAD.Colors.Color互转

假如各自实例化后的Color分别为: SysColor和CadColor 那么 SysColor转AutoDesk.AutoCAD.Colors.Color为:Autodesk.AutoCAD.Colors.Color.FromColor(SysColor) CadColor转 System.Drawing.Color为:CadColor.ColorValue

AutoCAD.Net/C#.Net QQ群:193522571 resultbuffer 中的typedvalue

ResultBuffer中的TypedValue ,5005,5006,5009都代表什么类型? //运行命令 ResultBuffer rb = new ResultBuffer(); rb.Add(new TypedValue(5005, "_revcloud")); if (!cloudType) { rb.Add(new TypedValue(5005, "_s")); rb.Add(new TypedValue(5005, "_c"))

AutoCAD.Net/C#.Net QQ群:193522571 窗体不闪烁

public void MXBFY() { TranslateMxb Translate = new TranslateMxb(); FrmTranslateMxb frm = new FrmTranslateMxb(); CadBaseSet.RH.MoveBackWindows(frm); frm.Translate = Translate; Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(frm); if (

AutoCAD.Net/C#.Net QQ群:193522571 从已有cuix中导入工作经典空间

[CommandMethod("cloneWS")] public void cloneWorkSpace() { try { string sourceCuiFileName = @"C:\TEST.CUIX"; if (!File.Exists(sourceCuiFileName)) return; string curCuiFileName = Application.GetSystemVariable("MENUNAME").ToStri

AutoCAD.Net/C#.Net QQ群:193522571 从已有A.DWG中复制块BLK到新DWG中的方法

1.新建一个Database,new Database(true, false); 2.以A.DWG为原型新建一个Database,new Database(false,true); 3.将2中的块表记录复制到1的块表中: 4.新建一个块参照,new BlockReference(blockReferencePoint, blocoId); 5.插入到1的Database中,InsertBlockReference(db, blockReference); 对于已有的DWG:new Databa

AutoCAD.Net/C#.Net QQ群:193522571 c#链接到网址

/// <summary> /// 链接到当前地址 /// </summary> /// <param name="URL"></param> public static void LinkTo(this string URL) { ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe"); startInfo.WindowStyle = Pro

AutoCAD.Net/C#.Net QQ群:193522571 WINFORM获取计算机名、域名、用户名

string MachineName = System.Environment.MachineName; string UserDomainName = System.Environment.UserDomainName; string UserName = System.Environment.UserName;