• CAD二次开发---导入外部文件中的块并输出预览图形(五)


    思路:

    1)首先要定义一个数据库对象来表示包含块的文件,改数据库对象会被加载到内存中,但不会被显示在CAD窗口中。

    2)调用Database类的ReadDwgFile函数将外部文件DWG文件读入到新创建的数据库对象中。

    3)最后调用Database类的WblockCloneObjects函数将外部的DWG文件中块对象复制到当前数据库中。

     1 /// <summary>
     2         /// 外部文件导入块,
     3         /// </summary>
     4         /// <param name="desdb">目标数据库</param>
     5         /// <param name="sourceFileName">完整的外部文件名</param>
     6         public static void ImportBlocksFrmDwg(this Database desdb, string sourceFileName)
     7         {
     8             //public Database(bool buildDefaultDrawing, bool noDocument);
     9             Database sourceDb = new Database(false, true);//创建一个新的数据库对象,作为源数据库,以读入外部文件中的对象
    10 
    11             try
    12             {
    13                 //把DWG文件读入到一个临时的数据库中
    14                 // public void ReadDwgFile(string fileName, FileShare fileSharing, bool allowCPConversion, string password);
    15                 sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, null);
    16                 //创建一个变量来存储块的ObjectId列表
    17                 ObjectIdCollection blocks = new ObjectIdCollection();
    18                 //获取源数据的事务处理管理器
    19                 Autodesk.AutoCAD.DatabaseServices.TransactionManager tranm = sourceDb.TransactionManager;
    20 
    21 
    22                 //在源数据库中开始数据处理
    23 
    24                 using (Transaction tran = tranm.StartTransaction())
    25                 {
    26                     //打开源数据库中的块表
    27                     //  public virtual DBObject GetObject(ObjectId id, OpenMode mode);
    28                     //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased);
    29                     //public virtual DBObject GetObject(ObjectId id, OpenMode mode, bool openErased, bool forceOpenOnLockedLayer);
    30                     BlockTable bt = (BlockTable)tran.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false);
    31 
    32                     foreach (ObjectId btrId in bt)
    33                     {
    34                         BlockTableRecord btr = tranm.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord;
    35                         //只加入命名块和非布局快到复制列表中
    36                         if (!btr.IsAnonymous && !btr.IsLayout)
    37                         {
    38                             blocks.Add(btrId);
    39                         }
    40                         btr.Dispose();
    41 
    42                     }
    43                     bt.Dispose();
    44                 }
    45 
    46                 IdMapping mapping = new IdMapping();
    47 
    48                 //从源数据库想目标数据库复制块表记录
    49                 sourceDb.WblockCloneObjects(blocks, desdb.BlockTableId, mapping, DuplicateRecordCloning.Replace, false);
    50 
    51 
    52             }
    53             catch(Autodesk.AutoCAD.Runtime.Exception ex )
    54             {
    55                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("错误信息"+ex.Message);
    56                 
    57 
    58             }
    59             //操作完成,销毁源数据库
    60             sourceDb.Dispose();
    61 
    62 
    63 
    64 
    65         }
    导入块函数

    实例:

     1     [CommandMethod("BlockPreview")]
     2         public void GenerateBlockPreview()
     3         {
     4             Database db = HostApplicationServices.WorkingDatabase;
     5 
     6             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
     7 
     8             PromptFileNameResult result = ed.GetFileNameForOpen("请选择需要预览的文件");
     9 
    10             if (result.Status != PromptStatus.OK) return;
    11 
    12             string filename = result.StringResult;
    13             //在C盘跟目录线,创建一个临时文件夹,用于存放文件中的块预览图标
    14             string path = "C:\Temp1";
    15             if (!Directory.Exists(path))
    16                 Directory.CreateDirectory(path);
    17 
    18             using (Transaction tran = db.TransactionManager.StartTransaction())
    19             {
    20                 //导入外部的块
    21                 db.ImportBlocksFrmDwg(filename);
    22 
    23                 //打开块表
    24                 BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
    25 
    26                 foreach (ObjectId id in bt)
    27                 {
    28                     BlockTableRecord btr = tran.GetObject(id, OpenMode.ForRead) as BlockTableRecord;
    29 
    30                     //如果是匿名块,布局块以及没有预览图型块,则返回
    31                     if (btr.IsAnonymous || btr.IsLayout || !btr.HasPreviewIcon)
    32                     {
    33                         //获取预览图块,适用于2008及以下版本
    34                         Bitmap preview = BlockThumbnailHelper.GetBlockThumbanail(btr.ObjectId);
    35                         //
    36                         //Bitmap preview = btr.PreviewIcon;//适用于2009版本及以上版本
    37 
    38                         preview.Save(path + "\" + btr.Name + ".bmp");//保存块预览
    39                     }
    40 
    41                 }
    42                 tran.Commit();
    43 
    44             }
    45 
    46         }
    读取外部文件中的块,并输出预览图
  • 相关阅读:
    Visual Studio的框选代码区块功能
    序列化和反序列化
    使用C#采集Shibor数据到Excel
    LiveCharts文档-4基本绘图-3其他
    LiveCharts文档-4基本绘图-2基本柱形图
    LiveCharts文档-4基本绘图-1基本线条图
    LiveCharts文档-3开始-8自定义工具提示
    LiveCharts文档-3开始-7标签
    LiveCharts文档-3开始-6轴Axes
    LeetCode题解汇总(包括剑指Offer和程序员面试金典,持续更新)
  • 原文地址:https://www.cnblogs.com/sly-tongtong/p/4270143.html
Copyright © 2020-2023  润新知