Импорт опредления блока из другого чертежа

Опубликовано 11.10.2011 21:17

Нередко требуется из одного чертежа импортировать определение блока в др. чертёж. Напишем код, выполняющий эту простую операцию.

   1:  /// <summary>
   2:  /// Импортировать в базу данных чертежа массив определений блоков из другого файла по их именам
   3:  /// </summary>
   4:  /// <param name="targetDb">Целевая база данных</param>
   5:  /// <param name="sourceFileName">Имя чертежа, в котором находятся нужные определения блоков</param>
   6:  /// <param name="password">пароль для открытия файла, в котором хранятся нужные определения блоков</param>
   7:  /// <param name="blockDefinitionNames">имена определений блоков, подлежащие импорту</param>
   8:  /// <param name="behaviour">Как поступать, если в целевой базе данных уже имеется определение блока с таким именем</param>
   9:  public static void BlockDefinitionsImport(this Database targetDb, string sourceFileName, string password,
  10:      string[] blockDefinitionNames, DuplicateRecordCloning behaviour) {
  11:      if (!File.Exists(sourceFileName))
  12:          throw new FileNotFoundException(sourceFileName);
  13:      using (Database sourceDb = new Database(false, true)) {
  14:          try {
  15:              // Считываем содержимое чертежа (dwg-файла) в объект базы данных
  16:              sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, password);
  17:   
  18:              // Создаём переменную, в которой будем хранить идентификаторы нужных нам определений блоков
  19:              ObjectIdCollection blockIds = new ObjectIdCollection();
  20:   
  21:              using (Transaction t = sourceDb.TransactionManager.StartTransaction()) {
  22:                  // Открываем таблицу блоков
  23:                  BlockTable bt = (BlockTable) t.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false);
  24:   
  25:                  // Извлекаем нужные определения блоков
  26:                  foreach (BlockTableRecord btr in bt.Cast<ObjectId>().Select(n => 
  27:                      (BlockTableRecord) t.GetObject(n, OpenMode.ForRead, false))
  28:                      .Where(n => !n.IsAnonymous && !n.IsLayout && blockDefinitionNames.Contains(n.Name))) {
  29:                      blockIds.Add(btr.ObjectId);
  30:                      btr.Dispose();
  31:                  }
  32:              }
  33:              // Копируем определения блоков в нужную нам базу данных
  34:              IdMapping mapping = new IdMapping();
  35:              sourceDb.WblockCloneObjects(blockIds, targetDb.BlockTableId, mapping, behaviour, false);
  36:          }
  37:          catch (Autodesk.AutoCAD.Runtime.Exception ex) {
  38:              throw new System.Exception(string.Format("В процессе импорта произошла ошибка: {0}", ex.Message));
  39:          }                
  40:      }
  41:  }


Comments