Импорт AutoCAD DXF

Автор p2p, 11 октября 2011, 15:16

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

p2p

Подскажите,: каким образом наиболее корректно можно выполнить импорт из AutoCAD в Draw? DXF содержат параметр $DWGCODEPAGE ANSI_1251, но в Draw не отображается кириллица -  либо вообще пусто, либо "±εßδ■ΣσφΦΦ ∩≡σΣ≤±∞ε". Пробовал все версии сохранения AutoCAD, изменял кодовую страницу файлов.
Через SVG теряются слои и линии с толщиной, отличной от 0 преобразуются в площадные объекты. Пробовал копировать, вставить из AutoCAD в Draw, так же теряются русские буквы.
У кого получилось, приведите пожалуйста пример DXF файла с русским текстом.

p2p

#1
путем манипуляций с кодом выяснил, что кириллица вставляется с перекодированием в греческий. Осталось решить как перекодировать в кириллицу и разобраться с процентом сжатия текста (сдвиг возникает).
Sub DrawGreek2Rus
  dim oObject
  dim sGText as string
  dim sRText as string
  dim sGSymbol as string
  dim sRSymbol as string
  dim aGreek() as integer
  dim aRus() as integer
  aGreek= Split("0, 9786, 9787, 9829, 9830, 9827, 9824, 8226, 9688, 9675, 9689, 9794, 9792, 9834, 9835, 9788, 9658, 9668, 8597, 8252, 182, 167, 9644, 8616, 8593, 8595, 8594, 8592, 8735, 8596, 9650, 9660,32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 8962, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186,  191, 8976, 172, 189, 188, 161, 171, 187,9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945,   223,  915,  960,  931,  963,  181,  964,  934,  920,  937,  948, 8734,  966,  949, 8745, 8801,  177, 8805, 8804, 8992, 8993,  247, 8776,  176, 8729,  183, 8730, 8319,  178, 9632, 160",",")
  aRus  = Split("0, 9786, 9787, 9829, 9830, 9827, 9824, 8226, 9688, 9675, 9689, 9794, 9792, 9834, 9835, 9788, 9658, 9668, 8597, 8252, 182, 167, 9644, 8616, 8593, 8595, 8594, 8592, 8735, 8596, 9650, 9660,32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 8962, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 1025, 8976, 172, 189, 188, 161, 171, 187,9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 1105, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103",",")
  for i = lbound(aGreek) to ubound(aGreek)
    aGreek(i)=cint(aGreek(i))
  Next
  With thisComponent
    For i=0 to .DrawPages.Count-1
      For j=0 to .DrawPages(i).Count-1
        oObject=.DrawPages(i).getByIndex(j)
        sGText=oObject.String
        iText=len(sGText)
        sRText=""
        For k=1 to iText
          sGSymbol=Mid(sGText, k, 1)
          sRSymbol=""
          Code = Asc(sGSymbol)
          For l = lbound(aGreek) to ubound(aGreek)
        if Code=aGreek(l) then
          sRSymbol=chr(aRus(l))
          sRText=sRText & sRSymbol
          Exit For
        End if
          Next
          if sRSymbol="" then
            sRText=sRText & sGSymbol
          End if
        Next
        oObject.String=sRText
      Next
    Next
  End With
End Sub

Yakov

Доработать Cyrrilic Tools (который работает только с writer и calc)
http://openoffice.vspu.ac.ru/doc/

p2p

#3
Правлю прямо в первом коде. прогресс налицо. Потом оптимизирую.

Yakov, Cyrrilic Tools по ссылке я нашел только страницы описания, переходы. Или нет исходников или меня к ним не пускает.

Yakov

#4
Цитата: p2p от 19 октября 2011, 13:16Yakov, Cyrrilic Tools по ссылке я нашел только страницы описания, переходы. Или нет исходников или меня к ним не пускает.
Да, там проблема в ссылке (почему - то сервер не работает)
Скачать можно здесь:
http://openoffice.vspu.ac.ru/cyrtools1.3.uno.zip

http://openoffice.vspu.ac.ru/  - главная страница проекта.

p2p

#5
Кодировку восстановил, остается вопрос позиции.
При разбиении вставленного в Draw файла DXF текст смещается вниз-вправо. Происходит это судя по всему из за создания вокруг текста какой то области - врезки. Щелчок на тексте - прямоугольник вокруг текста, щелчок на этом прямоугольнике - контур бОльшей площади. Она примерно в 3-4 раза больше исходного текста с верхним левым углом совпадающим с необходимой позицией текста. Сейчас ищу, что это за область. Вручную (мышкой) она никак не  меняется, то есть её нельзя сжать до размера текста. Если я руками вставляю текст в Draw, то визуально присутствует только один контур.

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

Yakov

Доработанный вариант макроса.
Проверял на перекодировании документа Draw, полученного импортом из Visio (для LibreOffice).
Теперь русские буквы отображаются!!!
;)


Цитировать

Sub DrawGreek2Rus
 dim oObject
 dim sGText as string
 dim sRText as string
 dim sGSymbol as string
 dim sRSymbol as string
 dim aGreek() as integer
 dim aRus() as integer
 aGreek=  Array ( _
         &h20AC, &h0081, &h201A, &h0192, &h201E, &h2026, &h2020, &h2021, _
         &h02C6, &h2030, &h0160, &h2039, &h0152, &h008D, &h017D, &h008F, _
         &h0090, &h2018, &h2019, &h201C, &h201D, &h2022, &h2013, &h2014, _
         &h02DC, &h2122, &h0161, &h203A, &h0153, &h009D, &h017E, &h0178, _
         &h00A0, &h00A1, &h00A2, &h00A3, &h00A4, &h00A5, &h00A6, &h00A7, _
         &h00A8, &h00A9, &h00AA, &h00AB, &h00AC, &h00AD, &h00AE, &h00AF, _
         &h00B0, &h00B1, &h00B2, &h00B3, &h00B4, &h00B5, &h00B6, &h00B7, _
         &h00B8, &h00B9, &h00BA, &h00BB, &h00BC, &h00BD, &h00BE, &h00BF, _
         &h00C0, &h00C1, &h00C2, &h00C3, &h00C4, &h00C5, &h00C6, &h00C7, _
         &h00C8, &h00C9, &h00CA, &h00CB, &h00CC, &h00CD, &h00CE, &h00CF, _
         &h00D0, &h00D1, &h00D2, &h00D3, &h00D4, &h00D5, &h00D6, &h00D7, _
         &h00D8, &h00D9, &h00DA, &h00DB, &h00DC, &h00DD, &h00DE, &h00DF, _
         &h00E0, &h00E1, &h00E2, &h00E3, &h00E4, &h00E5, &h00E6, &h00E7, _
         &h00E8, &h00E9, &h00EA, &h00EB, &h00EC, &h00ED, &h00EE, &h00EF, _
         &h00F0, &h00F1, &h00F2, &h00F3, &h00F4, &h00F5, &h00F6, &h00F7, _
         &h00F8, &h00F9, &h00FA, &h00FB, &h00FC, &h00FD, &h00FE, &h00FF  _
      )
 aRus  =Array ( _
         &h0402, &h0403, &h201A, &h0453, &h201E, &h2026, &h2020, &h2021, _
         &h20AC, &h2030, &h0409, &h2039, &h040A, &h040C, &h040B, &h040F, _
         &h0452, &h2018, &h2019, &h201C, &h201D, &h2022, &h2013, &h2014, _
         &h0098, &h2122, &h0459, &h203A, &h045A, &h045C, &h045B, &h045F, _
         &h00A0, &h040E, &h045E, &h0408, &h00A4, &h0490, &h00A6, &h00A7, _
         &h0401, &h00A9, &h0404, &h00AB, &h00AC, &h00AD, &h00AE, &h0407, _
         &h00B0, &h00B1, &h0406, &h0456, &h0491, &h00B5, &h00B6, &h00B7, _
         &h0451, &h2116, &h0454, &h00BB, &h0458, &h0405, &h0455, &h0457, _
         &h0410, &h0411, &h0412, &h0413, &h0414, &h0415, &h0416, &h0417, _
         &h0418, &h0419, &h041A, &h041B, &h041C, &h041D, &h041E, &h041F, _
         &h0420, &h0421, &h0422, &h0423, &h0424, &h0425, &h0426, &h0427, _
         &h0428, &h0429, &h042A, &h042B, &h042C, &h042D,   &h042E, &h042F, _
         &h0430, &h0431, &h0432, &h0433, &h0434, &h0435, &h0436, &h0437, _
         &h0438, &h0439, &h043A, &h043B, &h043C, &h043D, &h043E, &h043F, _
         &h0440, &h0441, &h0442, &h0443, &h0444, &h0445, &h0446, &h0447, _
         &h0448, &h0449, &h044A, &h044B, &h044C, &h044D, &h044E, &h044F  _
      )
 for i = lbound(aGreek) to ubound(aGreek)
   aGreek(i)=cint(aGreek(i))
 Next
 With thisComponent
   For i=0 to .DrawPages.Count-1
     For j=0 to .DrawPages(i).Count-1
       oObject=.DrawPages(i).getByIndex(j)
       sGText=oObject.String
       iText=len(sGText)
       sRText=""
       For k=1 to iText
         sGSymbol=Mid(sGText, k, 1)
         sRSymbol=""
         Code = Asc(sGSymbol)
         For l = lbound(aGreek) to ubound(aGreek)
           if Code=aGreek(l) then
             sRSymbol=chr(aRus(l))
             sRText=sRText & sRSymbol
             Exit For
           End if
         Next
         if sRSymbol="" then
           sRText=sRText & sGSymbol
         End if
       Next
       oObject.String=sRText
     Next
   Next
 End With
End Sub


Yakov

#7
Цитата: Yakov от 27 января 2012, 18:22Доработанный вариант макроса.
Проверял на перекодировании документа Draw, полученного импортом из Visio (для LibreOffice).
Упаковал в расширение этот вариант.  ;)
Меню "Перекодировка" отображается только в Draw.
После установки расширения требуется закрыть все приложения  LibreOffice.

[вложение удалено Администратором]

p2p

#8
Осталась проблема смещения, и кодировки текст с разделителями для перекодировки UTF-8 в UTF-16. Его можно вычислить и перекодировать:

Function UTF8_Decode(ByVal sStr As String)
Dim l As Long, sUTF8 As String, iChar As Integer, iChar2 As Integer
For l = 1 To Len(sStr) Step 2
iChar = Asc(Mid(sStr, l + 1, 1))
iChar2 = Asc(Mid(sStr, l, 1))
if not iChar2 and 9576 then
          sUTF8 = sUTF8 & Chr$(((31 And iChar2) * 64 + (63 And iChar)))
  iTest = asc(Chr$(((31 And iChar2) * 64 + (63 And iChar))))
else
          sUTF8 = sUTF8 & Chr$(iChar)
        end if
Next l
UTF8_Decode = sUTF8
End Function

горбатенько и не красиво, латание дыр.

ape

Цитата: Yakov от 30 января 2012, 00:07
Упаковал в расширение этот вариант. Меню "Перекодировка" отображается только в Draw.
Yakov, осталась 1 проблема: пункт "Перекодировка" в строке меню не переключает своё название на "Recoding" при смене языка Офиса на английский. Думаю, что языковую проблему (для всех доступных языков) можно решить так: "опустить" слово "Перекодировка" значком в стандартную (только для Draw) панель управления.
---------------
Если есть проблемы с пиктограммой, могу помочь в решении этой задачи.

ape

Значок примерно такой. Если есть принципиальное "да", можно доработать и добавить 16х16.

[вложение удалено Администратором]

Yakov

Попробую разобраться с меню, тем более что подменю переключает язык при смене языка.
А значок интересный.

Yakov

#12
Версия с исправленной локализацией

[вложение удалено Администратором]

ape

#13
Yakov, я не спец в СтарБ эйсике, но решение по переносу меню и значкам есть в спец.расширениях Инфра-ресурс - "Вставка из Веб", "Удаление личных данных" и "Мини-калькулятор". Личное мнение - расширение Н.Гарбуза "Мини-калькулятор" подходит не только по лицензии, но, главное, в качестве образца по использованию IMAGE-ресурсов - он хорошо продумал этот вопрос. Обратите внимание на иконку "22х22". Она, скорее всего, потребуют прозрачной окантовки до размера 26х26 или 24х24. Это надо смотреть по "Танго". Маленький значок (16х16) также вырезается с окантовкой, он отцентрован.

[вложение удалено Администратором]

Yakov

Лучше всего ориентироваться на расширения, которые можно сделать с помощью
BasicAddonBuilder.
http://myooo.ru/content/view/137/32/
Но он не всегда правильно видит требуемый макрос, который нужно экспортировать.
Зато можно попробовать со стандартными и посмотреть результат.