Конвертация содержимого в тексте в кодировку UTF и экспорт данных в текстовый фа

Автор Тема: Конвертация содержимого в тексте в кодировку UTF и экспорт данных в текстовый фа  (Прочитано 3504 раз)

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

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

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Добрый день!
Для рабочих целей понадобилось сделать процедуру, которая бы выбирала в чертеже все тексты и все точки, устанавливала бы соответствие каждого текста и точки (по расстоянию между ними) и экспортировала бы данные в текстовый файл вида "Наименование (содержимое текста) - координаты точки соответствия".
Нижеприведенный код работает в большинстве файлов dwg, которые были созданы непосредственно в среде Autocad. Но попался один "корявый" файл, пример которого я вложил к данному посту, у которого при экспорте содержимое текста выводится с включением латиницы внутри (Изoляtop, Гocлecoпиtomhиk).
Подскажите, пожалуйста, что можно в коде исправить/добавить, чтобы "переварить" данный файл?

Код - vb.net [Выбрать]
  1.        <CommandMethod("MyGroup", "Export_tochek_tekstov", "Export_tochek_tekstov", CommandFlags.Modal + CommandFlags.UsePickSet)>
  2.         Public Sub Export_tochek_tekstov()
  3.  
  4.             Dim acBlkTbl As BlockTable 'объявляем переменные для базы с примитивами чертежа
  5.             Dim acBlkTblRec As BlockTableRecord
  6.             Dim AllTXT, AllPT As SelectionSet
  7.  
  8.             '______создаем фильтры выбора для всех точек в чертеже____________________________________
  9.             Dim PTtv As TypedValue() = New TypedValue(0) {}
  10.             PTtv.SetValue(New TypedValue(CInt(DxfCode.Start), "POINT"), 0)
  11.             Dim PTfilter As SelectionFilter = New SelectionFilter(PTtv)
  12.             Dim PTresult As PromptSelectionResult = ed.SelectAll(PTfilter) '___________выбираются все точки в чертеже
  13.             If PTresult.Status = PromptStatus.OK Then
  14.                 AllPT = PTresult.Value
  15.                 ed.WriteMessage(vbCrLf & "В чертеже обнаружено " & AllPt.Count.ToString & " точек для обработки")
  16.             Else
  17.                 ed.WriteMessage(vbCrLf & "В чертеже отсутствуют 3-д точки" & vbCrLf)
  18.                 Exit Sub
  19.             End If
  20.             '________________________________________________________________________
  21.             '______создаем фильтры выбора всех текстов в чертеже____________________________________
  22.             Dim TXTtv As TypedValue() = New TypedValue(0) {}
  23.             TXTtv.SetValue(New TypedValue(CInt(DxfCode.Start), "TEXT"), 0)
  24.             Dim TXTfilter As SelectionFilter = New SelectionFilter(TXTtv)
  25.             Dim TXTresult As PromptSelectionResult = ed.SelectAll(TXTfilter) '___________выбираются все тексты в чертеже
  26.             If TXTresult.Status = PromptStatus.OK Then
  27.                 AllTXT = TXTresult.Value
  28.                 ed.WriteMessage(vbCrLf & "В чертеже обнаружено " & AllTXT.Count.ToString & " текстов для обработки")
  29.             Else
  30.                 ed.WriteMessage(vbCrLf & "В чертеже отсутствуют тексты" & vbCrLf)
  31.                 Exit Sub
  32.             End If
  33.             '________________________________________________________________________
  34.             Dim DblResDopusk As PromptDoubleResult = ed.GetDouble(vbCrLf & "Введите допустимое расстояние от текста до 3-d точки")
  35.             If DblResDopusk.Status <> PromptStatus.OK Then
  36.                 ed.WriteMessage(vbCrLf & "Необходимо ввести число" & vbCrLf)
  37.                 Exit Sub
  38.             End If
  39.  
  40.             Dim sInfo As String  ' задаем переменную для информационной строки будущего файла
  41.             Dim PtName As String
  42.             Dim PtcoordX, PtcoordY, PtcoordH As Double
  43.             Dim TXTcoordX, TXTcoordY As Double
  44.             Dim sFile As String = doc.Name & "_пункты" & ".txt" 'считываем имя активного чертежа (отбрасываем расширение) - задаем полное имя файла
  45.  
  46.             Dim writer As New System.IO.StreamWriter(sFile, False, Encoding.UTF8) 'создаем текстовый файл для записи в нём данных с кодировкой UTF8
  47.             Dim RowCounter As Integer = 0
  48.  
  49.             '____________________________________________________________________________________________________________
  50.             For Each txtObj As SelectedObject In AllTXT 'перебираем каждый выбранный объект (текст)
  51.  
  52.                 Using Trans As Transaction = db.TransactionManager.StartTransaction() ' начинаем транзакцию
  53.                     acBlkTbl = Trans.GetObject(db.BlockTableId, OpenMode.ForRead) 'открываем для чтения класс BlockTable
  54.                     acBlkTblRec = Trans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  55.                     Try 'начинаем обработку с блоком конструкцией улавливания ошибок
  56.                         Dim ent As Entity = TryCast(Trans.GetObject(txtObj.ObjectId(), OpenMode.ForWrite), Entity) 'приводим выбранный объект к типу Entity
  57.                         Dim MyTXT As DBText = TryCast(Trans.GetObject(ent.ObjectId, OpenMode.ForWrite), DBText) 'приводим выбранный объект от типа entity к нужному мне типу DBText
  58.  
  59.                         '_______________________ВОПРОС ПО ЭТОМУ БЛОКУ СТРОК - В РЕЗУЛЬТАТЕ ПЕРЕКОДИРОВКИ ПОЛУЧАЮТСЯ СТРОКИ, ГДЕ НЕКОТОРЫЕ ЗНАКИ КИРИЛЛИЦЫ ЗАМЕНЯЮТСЯ ЛАТИНИЦЕЙ
  60.                         Dim mybuffer As Byte() = New Byte(255) {}                                      '
  61.                         mybuffer = Encoding.Unicode.GetBytes(MyTXT.TextString)                         '
  62.                         mybuffer = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, mybuffer)         '    
  63.                         PtName = Encoding.UTF8.GetString(mybuffer)                                     '
  64.                         PtName = PtName.Normalize                                                      '
  65.                         PtName = Trim(PtName)                                                          '
  66.                         PtName = StrConv(PtName, vbProperCase)                                         '
  67.                         '_______________________________________________________________________________________________________
  68.                         TXTcoordX = MyTXT.Position.X
  69.                         TXTcoordY = MyTXT.Position.Y
  70.                         For Each PtObj As SelectedObject In AllPT 'перебираем каждую выбранную точку
  71.                             Dim PTent As Entity = TryCast(Trans.GetObject(PtObj.ObjectId(), OpenMode.ForWrite), Entity) 'приводим выбранный объект к типу Entity
  72.                             'ed.WriteMessage(vbCrLf & "Тип выбранного объекта " & ent.GetType.ToString() & vbCrLf) ' вспомогательная строка для отладки
  73.                             Dim MyPT As DBPoint = TryCast(Trans.GetObject(PTent.ObjectId, OpenMode.ForWrite), DBPoint) 'приводим выбранный объект от типа entity к нужному мне типу DBPoint
  74.                             PtcoordX = Round(MyPT.Position.X, 3)
  75.                             PtcoordY = Round(MyPT.Position.Y, 3)
  76.                             PtcoordH = Round(MyPT.Position.Z, 3)
  77.                             Dim MyRasst As Double = Vychisli_S(MyTXT.Position, MyPT.Position) 'вычисляется расстояние между точками во вспомогательной функции, и если оно меньше
  78.                             '                                                                  заданного допуска, то пишется строка с именем в виде содержимого текста и координатами точки
  79.                             If MyRasst <= DblResDopusk.Value Then
  80.                                 'запускаем процедуру печатания строки текстового файла
  81.                                 sInfo = PtName & vbTab & PtcoordY.ToString & vbTab & PtcoordX.ToString & vbTab & PtcoordH.ToString & vbCrLf 'записываем данные в строчку через разделитель TAB
  82.                                 writer.Write(sInfo) 'записываем строку в файл
  83.                                 RowCounter += 1
  84.                             End If
  85.                         Next 'переходим к следующей точке
  86.                         '____________________________________________________________________
  87.                         Trans.Commit() 'закрываем транзакцию с примитивами
  88.                     Catch ex As System.Exception 'в случае обнаружения ошибки пишем её описание и прерываем транзакцию
  89.                         ed.WriteMessage("Ошибка " + ex.Message)
  90.                         Trans.Abort()
  91.                     Catch exA As Autodesk.AutoCAD.Runtime.Exception 'в случае обнаружения ошибки пишем её описание и прерываем транзакцию
  92.                         ed.WriteMessage("Ошибка " + exA.Message)
  93.                         Trans.Abort()
  94.                     End Try
  95.                 End Using
  96.             Next 'переходим к следующему выбранному тексту
  97.             writer.Close() 'закрываем запись файла
  98.             ed.WriteMessage(vbCrLf & "В файл записано  " & RowCounter.ToString & " точек" & vbCrLf)
  99.             ed.WriteMessage(vbCrLf & "Создан файл " & sFile & vbCrLf) 'вспомогательно пишем в редактор сообщение о созданном файле, путь к файлу оттуда можно будет посмотреть
  100.         End Sub