Загрузка в чертёж новых типов линий

16.11.2011

Набросал несколько методов, которые могут быть полезны тогда, когда потребуется загружать в чертёж типы линий из lin-файлов. Краткая информация по методам:
  • LinetypeInfo - класс, в который упаковывается полная информация о типах линии, полученная из lin-файлов.
  • FindAllLintypes - найти все lin-файлы и извлечь из них информацию обо всех типах линий, упаковав её в объекты класса LinetypeInfo.
  • GetSuitableLinFiles - найти все lin-файлы, в которых содержится определение типа линии с указанным нами именем.
  • LinetypeLoad - загрузить в чертёж из указанного lin-файла заданный тип линии.
Предварительно создаю вспомогательный класс, в котором будет содержаться вся информация о типе линии, считанная из lin-файла:

Класс LinetypeInfo:

   1:  /// <summary>
   2:  /// Класс, представляющий собой подробную информацию о типе линии
   3:  /// </summary>
   4:  public sealed class LinetypeInfo {
   5:      public string File { get; private set; }
   6:      public string Name { get; private set; }
   7:      public string Description { get; private set; }
   8:      public string Definition { get; private set; }
   9:      /// <summary>
  10:      /// Конструктор класса
  11:      /// </summary>
  12:      /// <param name="file">Полное имя lin-файла, в котором находится определение типа линии</param>
  13:      /// <param name="name">Наименование типа линии</param>
  14:      /// <param name="description">Описание типа линии</param>
  15:      /// <param name="definition">Определение (исходный код) типа линии</param>
  16:      public LinetypeInfo(string file, string name, string description, string definition) {
  17:          File = file;
  18:          Name = name;
  19:          Description = description;
  20:          Definition = definition;
  21:      }
  22:  }

Далее привожу код реализации указанных выше методов.

Код C#

   1:  ...
   2:  using acad = Autodesk.AutoCAD.ApplicationServices.Application;
   3:  using AcAp = Autodesk.AutoCAD.ApplicationServices;
   4:  using AcDb = Autodesk.AutoCAD.DatabaseServices;
   5:  using AcEd = Autodesk.AutoCAD.EditorInput;
   6:  using AcRx = Autodesk.AutoCAD.Runtime;
   7:  using AcClr = Autodesk.AutoCAD.Colors;
   8:  ...
   9:  /// <summary>
  10:  /// Получить информацию обо всех доступных для загрузки типах линий.
  11:  /// </summary>
  12:  /// <returns>Результат упаковывается в массив объектов LinetypeInfo</returns>
  13:  public LinetypeInfo[] FindAllLintypes() {
  14:   
  15:      string[] all_linFiles = acad.UserConfigurationManager.OpenCurrentProfile().OpenSubsection("General")
  16:          .ReadProperty("ACAD", string.Empty).ToString().Split(';').Where(n => n != string.Empty)
  17:          .SelectMany(n => Directory.GetFiles(n, "*.lin", SearchOption.TopDirectoryOnly)).ToArray();            
  18:      List<LinetypeInfo> linetypes = new List<LinetypeInfo>();
  19:      List<string> linFiles = new List<string>();
  20:      foreach (string file in all_linFiles) {                
  21:          using (FileStream fs = new FileStream(file, FileMode.Open)) {
  22:              using (StreamReader sr = new StreamReader(fs, Encoding.Default)) {
  23:                  while (!sr.EndOfStream) {
  24:                      string str = sr.ReadLine();
  25:                      if (str.StartsWith("*")) {
  26:                          string ltname = str.Substring(1, str.IndexOf(',') - 1);
  27:                          linetypes.Add(new LinetypeInfo(file, ltname, str.Substring(str.IndexOf(',') + 1).Trim(), sr.ReadLine()));
  28:                      }
  29:                  }                        
  30:                  fs.Close();
  31:                  sr.Close();
  32:              }
  33:          }
  34:      }
  35:      return linetypes.ToArray();
  36:  }
  37:   
  38:  /// <summary>
  39:  /// Получить полные имена тех lin-файлов, в которых имеется определение типа линии с указанным именем.
  40:  /// </summary>
  41:  /// <param name="linetypeName">Имя типа линии, определение которого следует найти</param>
  42:  /// <returns>Возвращается массив имён lin-файлов, в которых найдено определение типа линии, имеющее указанное имя</returns>
  43:  public string[] GetSuitableLinFiles(string linetypeName) {
  44:      LinetypeInfo[] linetypes = FindAllLintypes();
  45:      return linetypes.Where(n => n.Name == linetypeName).Select(n => n.File).ToArray();
  46:  }
  47:   
  48:  /// <summary>
  49:  /// Загрузить в базу данных чертежа нужные типы линий. Если в базе данных уже имеется тип линии с таким же именем, 
  50:  /// как и у подлежащего загрузке, то произойдёт исключение, которое будет перехвачено в теле данного метода. В результате
  51:  /// работы метода, загружены будут только те типы линий, для которых не возникло исключений.
  52:  /// </summary>
  53:  /// <param name="lineTypeName">Имя типа линии, подлежащего загрузке, или паттерн, согласно которому следует выбирать 
  54:  /// и загружать типы линий</param>
  55:  /// <param name="NameIsPattern">Является ли строка, переданная в качестве имени, паттерном: true - паттерн, 
  56:  /// false - конкретное имя типа линии.</param>
  57:  /// <param name="linFileName">Имя lin-файла, в котором следует искать указанные для загрузки типы линий</param>
  58:  /// <param name="database">База данных чертежа, в которую следует выполнять загрузку указанных типов линий</param>
  59:  public void LinetypeLoad(string lineTypeName, bool NameIsPattern, string linFileName, AcDb.Database database) {
  60:      using (new WorkingDatabaseSwitcher(database)) {
  61:          //Если первым параметром указан паттерн выборки
  62:          if (NameIsPattern) {
  63:              try {
  64:                  database.LoadLineTypeFile(lineTypeName, linFileName);
  65:              }
  66:              catch { }
  67:          }
  68:          //Если первым параметром указано фиксированное имя
  69:          else {
  70:              StringBuilder sb = new StringBuilder();
  71:              foreach (char item in lineTypeName) {
  72:                  sb.Append('`');
  73:                  sb.Append(item);
  74:              }
  75:              lineTypeName = sb.ToString();
  76:              try {
  77:                  database.LoadLineTypeFile(lineTypeName, linFileName);
  78:              }
  79:              catch { }
  80:          }
  81:      }
  82:  }
  83:  ...


Comments