Сохранение данных в файл формата "*.dxf"

Автор Тема: Сохранение данных в файл формата "*.dxf"  (Прочитано 5841 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн matricariaАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Доброго времени суток!
Возможно пишу не совсем по теме, но нашла море полезной информации на просторах этого форума. Поэтому обращаюсь именно к Вам.
Задача такова:
Есть два массива значений Х и У координат некоторых точек. По этим точкам строится замкнутая кривая.
Необходимо создать файл, который бы открывался в AutoCAD.
Эта задача решена в методе Save_Det.
Логика в том, что сначала создаётся строчный массив для сохранения в "dxf" формате, лишь потом массив построчно записывается в файл.
Беда в том, что этот метод корректно работает лишь з массивами длиной до 50 элементов.
Когда передаешь массив длиной в 57 элементов:
Строчный массив создаётся успешно, но при записи что-то происходит. Итоговый файл при открытии получается недописанным. Будто что-то прерывает процесс (после 630 строк записи).
Код - C# [Выбрать]
  1.         void Save_Det(float[] x, float[] y, string name)
  2.         {
  3.             int w = 0;
  4.             int k = (x.Length - 1) * 12;         // the quantity of strings for LINES. One line_to_build writes 12 strings
  5.             int counter = 1;                     //the counter for written lines
  6.             string[] s = new string[k + 8 + 1];  // array for all lines
  7.             // filling array s[] with text
  8.             for (int i = 0; i <= (s.Length - 4); i++)
  9.             {
  10.                 string ch = Convert.ToString(i);
  11.                 // headlines
  12.                 switch (ch)
  13.                 {
  14.                     case "0":
  15.                         s[i] = "0";
  16.                         break;
  17.                     case "1":
  18.                         s[i] = "SECTION";
  19.                         break;
  20.                     case "2":
  21.                         s[i] = "2";
  22.                         break;
  23.                     case "3":
  24.                         s[i] = "ENTITIES";
  25.                         break;
  26.                     case "4":
  27.                         s[i] = "0";
  28.                         break;
  29.                 }
  30.                 // detail
  31.                 if ((i >= 5) && (i < (s.Length - 4)))
  32.                 {
  33.                     string j = Convert.ToString(i - 12 * (counter - 1));
  34.                     switch (j)
  35.                     {
  36.                         case "5":
  37.                             s[i] = "LINE";
  38.                             break;
  39.                         case "6":
  40.                             s[i] = "8";
  41.                             break;
  42.                         case "7":
  43.                             s[i] = "0";
  44.                             break;
  45.                         case "8":
  46.                             s[i] = "10";
  47.                             break;
  48.                         case "9":
  49.                             s[i] = x[counter - 1].ToString("0.000000", System.Globalization.CultureInfo.InvariantCulture);
  50.                             w++;
  51.                             break;
  52.                         case "10":
  53.                             s[i] = "20";
  54.                             break;
  55.                         case "11":
  56.                             s[i] = y[counter - 1].ToString("0.000000", System.Globalization.CultureInfo.InvariantCulture);
  57.                             break;
  58.                         case "12":
  59.                             s[i] = "11";
  60.                             break;
  61.                         case "13":
  62.                             s[i] = x[counter].ToString("0.000000", System.Globalization.CultureInfo.InvariantCulture);
  63.                             w++;
  64.                             break;
  65.                         case "14":
  66.                             s[i] = "21";
  67.                             break;
  68.                         case "15":
  69.                             s[i] = y[counter].ToString("0.000000", System.Globalization.CultureInfo.InvariantCulture);
  70.                             break;
  71.                         case "16":
  72.                             s[i] = "0";
  73.                             counter++;
  74.                             break;
  75.                     }
  76.                 }
  77.                 // end_of_file
  78.                 if (i == (s.Length - 4))
  79.                 {
  80.                     s[i] = "ENDSEC";
  81.                     s[i + 1] = "0";
  82.                     s[i + 2] = "EOF";
  83.                 }
  84.             }
  85.             // using stream save file
  86.             using (SaveFileDialog SaveFile = new SaveFileDialog())
  87.             {
  88.                 SaveFile.FileName = name;
  89.                 SaveFile.DefaultExt = "dxf";
  90.                 SaveFile.Filter = "txt files (*.dxf;*.txt)|*.dxf;*.txt|All files (*.*)|*.*";
  91.                 SaveFile.FilterIndex = 1;
  92.                 SaveFile.RestoreDirectory = true;
  93.                 // if user choose path, program will write data from array s[].
  94.                 if (SaveFile.ShowDialog() == DialogResult.OK)
  95.                 {
  96.                     string PathSave = SaveFile.FileName;
  97.                     StreamWriter myWriter = File.CreateText(PathSave);
  98.  
  99.                     for (int i = 0; i < s.Length; i++)
  100.                     {
  101.                         textBox9.Text += s[i] + Environment.NewLine;
  102.                         myWriter.WriteLine(s[i]);
  103.                     }
  104.                     MessageBox.Show("Файл сохранён","УРА",MessageBoxButtons.OK);
  105.                 }
  106.             }
  107.         }
  108.  
Констант на ограничение записи нет, в чём проблема - не пойму.   :-\
Подскажите, может есть какое-то ограничение на число записываемых строк "по умолчанию" которое можно изменить?

Отмечено как Решение matricaria 22-11-2020, 20:37:45

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не хватает после окончания записи:
Код - C# [Выбрать]
  1. myWriter.Dispose();
А еще лучше вместо:
Код - C# [Выбрать]
  1. StreamWriter myWriter = File.CreateText(PathSave);
  2.  
  3. for (int i = 0; i < s.Length; i++)
  4. {
  5.     textBox9.Text += s[i] + Environment.NewLine;
  6.     myWriter.WriteLine(s[i]);
  7. }
  8.  
записать:
Код - C# [Выбрать]
  1. using (StreamWriter myWriter = File.CreateText(PathSave))
  2. {
  3.    for (int i = 0; i < s.Length; i++)
  4.    {
  5.        textBox9.Text += s[i] + Environment.NewLine;
  6.        myWriter.WriteLine(s[i]);
  7.    }
  8. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
matricaria,
Забыл поприветствовать на форуме! :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн matricariaАвтор темы

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Да, это сработало!
Спасибо за оказанную помощь!
Не будет ли Вам трудно, объяснить. Почему не работало?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не будет ли Вам трудно, объяснить. Почему не работало?
Потому что "сброс буферов обмена в файл" происходит только при вызове StreamWriter.Dispose() (или  StreamWriter.Close(), что в данном случае одно и тоже). Фактически вы заполняли оперативную память и как-только буфер переполнился - буфер записался в файл. Дальнейшая запись в буфер до его переполнения и без вызова StreamWriter.Dispose() приводит к потере всей информации в буфере, так как она в файл не записывается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение