Экспорт информации из цепочки размеров во внешний txt-файл

Дата последнего редактирования: 08.09.2013
Причины редактирования:
- рефакторинг кода
- вывод в консоль полного имени конечного txt файла
- значения экспортируются с таким же количеством знаков после запятой, какая указана в размере или размерном стиле

С данной задачей обратились мои пользователи. 

Исходные данные:
На руках имеется присланные со стороны dwg-файлы, содержащие в своём составе профили (возможно что земли), образмеренные цепочками линейных размеров. 

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

Цепочка размеров длинная (несколько сотен примитивов). Для общего понимания показываю её фрагмент:


Для загрузки библиотеки используется команда NETLOAD. После загрузки становится доступной команда dim2txt.

Конечный результат получаю такой (скрины менять не стал, но в исправленной версии, предоставленной ниже, количество знаков после запятой совпадает с оригиналом):


Ниже приведён исходный код программы.

Код C#:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using acad = Autodesk.AutoCAD.ApplicationServices.Application;
   6:  using Autodesk.AutoCAD.ApplicationServices;
   7:  using Autodesk.AutoCAD.DatabaseServices;
   8:  using Autodesk.AutoCAD.EditorInput;
   9:  using Autodesk.AutoCAD.Runtime;
  10:  using System.IO;
  11:   
  12:  namespace DimDataExport
  13:  {
  14:      public class Class1
  15:      {
  16:          const string ns = "hwd";
  17:   
  18:          public Class1()
  19:          {
  20:              Document dwg = acad.DocumentManager.MdiActiveDocument;
  21:              Database db = dwg.Database;
  22:              Editor ed = dwg.Editor;
  23:              String asm = Path.GetFileName(this.GetType().Assembly.Location);
  24:              ed.WriteMessage("Загружен модуль {0}\n© Андрей Бушман", asm);
  25:          }
  26:          /// <summary>
  27:          /// Извлечение текстовой информации размеров во внешний одноимённый 
  28:          /// текстовый файл, находящийся в том же каталоге. При повторном вызове 
  29:          /// команды содержимое файла перезаписывается.
  30:          /// </summary>
  31:          [CommandMethod(ns, "dim2txt", CommandFlags.Modal)]
  32:          public void DimTextExport()
  33:          {
  34:              Document dwg = acad.DocumentManager.MdiActiveDocument;
  35:              Database db = dwg.Database;
  36:              Editor ed = dwg.Editor;
  37:   
  38:              //Создаю фильтр
  39:              SelectionFilter filter = new SelectionFilter(new TypedValue[] { 
  40:                  new TypedValue((int)DxfCode.Start, "Dimension") });
  41:   
  42:              //Получаю набор объектов согласно указанному фильтру
  43:              PromptSelectionResult result = ed.GetSelection(filter);
  44:   
  45:              //Если всё в порядке, то приступаю к работе...
  46:              if (result.Status == PromptStatus.OK)
  47:              {
  48:                  using (Transaction trs = dwg.TransactionManager.StartTransaction())
  49:                  {
  50:                      try
  51:                      {
  52:   
  53:                          String path = Path.GetDirectoryName(dwg.Name);
  54:                          path = path == String.Empty ? Environment.GetFolderPath(
  55:                              Environment.SpecialFolder.MyDocuments) : path;
  56:                          String name = Path.GetFileNameWithoutExtension(dwg.Name);
  57:                          String txt = Path.Combine(path, name) + ".txt";
  58:                          // Создаю новый поток записи в текстовый файл.
  59:                          using (StreamWriter sw = new StreamWriter(txt, false, Encoding.Default))
  60:                          {
  61:   
  62:                              // Сортирую размерные объекты по порядку их расположения, извлекаю 
  63:                              // реальное значение размера или же текста (если таковой имеется),
  64:                              // после чего записываю извлечённую информацию в поток
  65:                              result.Value.GetObjectIds().Select(n => trs.GetObject(n, OpenMode.ForRead)
  66:                                  as RotatedDimension).OrderBy(n => Math.Min(n.XLine1Point.X,
  67:                                      n.XLine2Point.X)).Select(n =>
  68:                                  {
  69:                                      sw.WriteLine(n.DimensionText == string.Empty ?
  70:                                          string.Format("{0}{1}{2}", n.Prefix, Math.Round(n.Measurement, n.Dimdec),
  71:                                          n.Suffix) : n.DimensionText); return n;
  72:                                  }).ToArray();
  73:   
  74:                              sw.Flush();
  75:                              sw.Close();
  76:                          }
  77:                          ed.WriteMessage("\nРезультат сохранён в файле '{0}'.\n", txt);
  78:                      }
  79:                      catch (System.Exception ex)
  80:                      {
  81:                          ed.WriteMessage(ex.Message);
  82:                      }
  83:                  }
  84:              }
  85:          }
  86:      }
  87:  }



Версия, откомпилированная для AutoCAD 2014 находится здесь.


Comments