Получение чертежей из каталогов и подшивок

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

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

Код C#

   1:  //Microsoft
   2:  using System;
   3:  using System.Collections.Generic;
   4:  using System.Collections;
   5:  using System.Linq;
   6:  using System.Text;
   7:  using System.ComponentModel;
   8:  using System.Globalization;
   9:  //AutoCAD
  10:  using acad = Autodesk.AutoCAD.ApplicationServices.Application;
  11:  using Autodesk.AutoCAD.ApplicationServices;
  12:  using Autodesk.AutoCAD.DatabaseServices;
  13:  using Autodesk.AutoCAD.EditorInput;
  14:  using Autodesk.AutoCAD.Runtime;
  15:  using System.IO;
  16:  using ACSMCOMPONENTS17Lib;
  17:  using System.Reflection;
  18:  using Bushman.AutoCAD.DatabaseServices;
  19:   
  20:  namespace Bushman.AutoCAD {
  21:   
  22:      /// <include file='./AcEnvironment.xml' path='Documentation/Item[@Name="AcEnvironment"]/Common/*'/>
  23:      public static class AcEnvironment {
  24:   
  25:          /// <summary>
  26:          /// Получить базы данных всех чертежей, листы которых входят в состав указанной подшивки
  27:          /// </summary>
  28:          /// <param name="sheetSetFileName">Анализируемая подшивка</param>
  29:          /// <returns>Возвращается перечисление найденных баз данных, листы которых используются в подшивке</returns>
  30:          public static FileInfo[] GetDrawingsFromSheetSet(string sheetSetFileName) {
  31:              //Проверяем наличие указанного файла
  32:              if (!File.Exists(sheetSetFileName))
  33:                  throw new FileNotFoundException(sheetSetFileName);
  34:              //Проверяем, что расширение файла соответствует расширению файла подшивки
  35:              FileInfo file = new FileInfo(sheetSetFileName);
  36:              if (file.Extension.ToLower() != ".dst")
  37:                  throw new System.Exception("Файл подшивки должен иметь расширение \".dst\"!");
  38:              //Получаем все листы подшивки
  39:              List<FileInfo> x = new List<FileInfo>();
  40:              //********************
  41:              // Получаем менеджера подшивки
  42:              AcSmSheetSetMgr mgr = new AcSmSheetSetMgr();
  43:   
  44:              // Создаём новый объект базы данных подшивки
  45:              AcSmDatabase db = new AcSmDatabase();
  46:   
  47:              // Пытаемся загрузить dst-файл 
  48:              try {
  49:                  db = mgr.OpenDatabase(sheetSetFileName, true);
  50:              }
  51:              catch (System.Exception ex) {
  52:                  throw new System.Exception(string.Format(
  53:                      "Не удалось открыть файл подшивки. Убедитесь, что он сейчас никем не используется. Сообщение: {0}", ex.Message));
  54:              }
  55:   
  56:              try {
  57:                  // На время блокируем базу данных подшивки от изменения извне
  58:                  db.LockDb(db);
  59:   
  60:                  AcSmSheetSet ss = db.GetSheetSet();
  61:                  ProcessEnumerator(ss.GetSheetEnumerator(), ref x);
  62:              }
  63:              catch (System.Exception ex) {
  64:                  throw new System.Exception(string.Format(
  65:                      "Не удалось заблокировать файл подшивки. Убедитесь, что он сейчас никем не используется. Сообщение: {0}", ex.Message));
  66:              }
  67:              //Снимаем блокировку базы данных подшивки
  68:              finally {
  69:                  db.UnlockDb(db, true);
  70:                  mgr.Close(db);
  71:              }
  72:              //Получаем базы данных чертежей, листы которых используются в подшивке
  73:              //Возвращаем результат обработки
  74:              return x.Select(n => n).Distinct().ToArray();
  75:          }
  76:   
  77:          /// <summary>
  78:          /// Извлечение полных имён файлов, включенных в состав подшивки
  79:          /// </summary>
  80:          /// <param name="iter">Родительский объект</param>
  81:          /// <param name="x">ссылка на объект List<FileInfo>, в котором инкапсулирован результат</param>
  82:          static void ProcessEnumerator(IAcSmEnumComponent iter, ref List<FileInfo> x) {
  83:              IAcSmComponent item = iter.Next();
  84:              while (item != null) {
  85:                  string type = item.GetTypeName();
  86:                  switch (type) {
  87:                  //Группа листов (рекурсивная обработка, т.к. может содержать вложенные группы листов)
  88:                  case "AcSmSubset":
  89:                      try {
  90:                          AcSmSubset subset = (AcSmSubset) item;
  91:                          string subName = subset.GetName();
  92:   
  93:                          if (!String.IsNullOrEmpty(subName)) {
  94:                              IAcSmEnumComponent enumerator = (IAcSmEnumComponent) subset.GetSheetEnumerator();
  95:                              ProcessEnumerator(enumerator, ref x);
  96:                          }
  97:                      }
  98:                      catch { }
  99:                      break;
 100:   
 101:                  //Лист
 102:                  case "AcSmSheet":
 103:                      try {
 104:                          AcSmSheet sh = (AcSmSheet) item;
 105:                          x.Add(new FileInfo(sh.GetLayout().GetFileName()));
 106:                          if (!String.IsNullOrEmpty(sh.GetName())) {
 107:                              IAcSmEnumComponent enumerator = (IAcSmEnumComponent) sh.GetSheetViews();
 108:                              ProcessEnumerator(enumerator, ref x);
 109:                          }
 110:                      }
 111:                      catch { }
 112:                      break;
 113:                  }
 114:                  item = iter.Next();
 115:              }
 116:          }
 117:   
 118:          /// <summary>
 119:          /// Получение всех чертежей, хранящихся в определённом каталоге
 120:          /// </summary>
 121:          /// <param name="directoryFullName">Полное имя каталога</param>
 122:          /// <param name="subDirsBrowse">Выполнять ли поиск по подкаталагам (True - выполнять; False - не выполнять)</param>
 123:          /// <returns>Возвращается последовательностьFileInfo</returns>
 124:          public static FileInfo[] GetDrawingsFromDirectory(string directoryFullName, bool subDirsBrowse) {
 125:              DirectoryInfo dir = new DirectoryInfo(directoryFullName);
 126:              if (!dir.Exists) throw new DirectoryNotFoundException();
 127:              return dir.GetFiles("*.dwg", subDirsBrowse ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)
 128:                  .AsEnumerable().OrderBy(n => n.DirectoryName).ThenBy(n => n.Name).ThenBy(n => n.Extension).ToArray();
 129:          }
 130:      }
 131:  }


Comments