思路:
1)首先要定义一个数据库对象来表示包含块的文件,改数据库对象会被加载到内存中,但不会被显示在CAD窗口中。
2)调用Database类的ReadDwgFile函数将外部文件DWG文件读入到新创建的数据库对象中。
3)最后调用Database类的WblockCloneObjects函数将外部的DWG文件中块对象复制到当前数据库中。
/// <summary>
/// 外部文件导入块,
/// </summary>
/// <param name="desdb">目标数据库</param>
/// <param name="sourceFileName">完整的外部文件名</param>
public static void ImportBlocksFrmDwg(this Database desdb, string sourceFileName)
{
//public Database(bool buildDefaultDrawing, bool noDocument);
Database sourceDb = new Database(false, true);//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象 try
{
//把DWG文件读入到一个临时的数据库中
// public void ReadDwgFile(string fileName, FileShare fileSharing, bool allowCPConversion, string password);
sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null);
//创建一个变量来存储块的ObjectId列表
ObjectIdCollection blocks = new ObjectIdCollection();
//获取源数据的事务处理管理器
Autodesk.AutoCAD.DatabaseServices.TransactionManager tranm = sourceDb.TransactionManager; //在源数据库中开始数据处理 using (Transaction tran = tranm.StartTransaction())
{
//打开源数据库中的块表
// public virtual DBObject GetObject(ObjectId id, OpenMode mode);
//public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased);
//public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer);
BlockTable bt = (BlockTable)tran.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); foreach (ObjectId btrId in bt)
{
BlockTableRecord btr = tranm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
//只加入命名块和非布局快到复制列表中
if (!btr.IsAnonymous && !btr.IsLayout)
{
blocks.Add(btrId);
}
btr.Dispose(); }
bt.Dispose();
} IdMapping mapping = new IdMapping(); //从源数据库想目标数据库复制块表记录
sourceDb.WblockCloneObjects(blocks, desdb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); }
catch(Autodesk.AutoCAD.Runtime.Exception ex )
{
Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("错误信息"+ex.Message); }
//操作完成,销毁源数据库
sourceDb.Dispose(); }
导入块函数
实例:
[CommandMethod("BlockPreview")]
public void GenerateBlockPreview()
{
Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptFileNameResult result = ed.GetFileNameForOpen("请选择需要预览的文件"); if (result.Status != PromptStatus.OK) return; string filename = result.StringResult;
//在C盘跟目录线,创建一个临时文件夹,用于存放文件中的块预览图标
string path = "C:\\Temp1";
if (!Directory.Exists(path))
Directory.CreateDirectory(path); using (Transaction tran = db.TransactionManager.StartTransaction())
{
//导入外部的块
db.ImportBlocksFrmDwg(filename); //打开块表
BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; foreach (ObjectId id in bt)
{
BlockTableRecord btr = tran.GetObject(id, OpenMode.ForRead) as BlockTableRecord; //如果是匿名块,布局块以及没有预览图型块,则返回
if (btr.IsAnonymous || btr.IsLayout || !btr.HasPreviewIcon)
{
//获取预览图块,适用于2008及以下版本
Bitmap preview = BlockThumbnailHelper.GetBlockThumbanail(btr.ObjectId);
//
//Bitmap preview = btr.PreviewIcon;//适用于2009版本及以上版本 preview.Save(path + "\\" + btr.Name + ".bmp");//保存块预览
} }
tran.Commit(); } }
读取外部文件中的块,并输出预览图