Как читать отформатированный файл ASCII STL с цифрами и символами различной длины, используя Fortran? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь прочитать файл STL с различным форматом. Файл STL в формате c состоит из

   solid solid_name
      facet normal n1 n2 n3 (the triangles normal vector)
         outerloop         (one of the markers I want to read)
            v1          x1 y1 z1
            v2          x2 y2 z2       (three vertex of the triangle/facet)    
            v3          x3 y3 z3
         endloop
        end facet
    endsolid

Идея состоит в том, чтобы l oop по всему solid, фасету и вершине и прочитать информацию. Моя проблема в том, что я пытаюсь читать файлы в разных форматах: например, в одном из них у меня есть для первого фасета:

>solid Peca2
>   facet normal 1.000000e+00 0.000000e+00 0.000000e+00
>      outer loop
>         vertex 1.250000e+02 7.500000e+01 1.000000e+02
>         vertex 1.250000e+02 2.500000e+01 1.000000e+02
>         vertex 1.250000e+02 7.500000e+01 5.000000e+01
>      endloop
and so on.

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

 solid Peca2

   facet normal 1.000000e+00
  0.000000e+0
 0 0.000000e+00

   outer loop

    vertex 1.250000e+

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

Итак, у меня есть несколько вопросов:

1) Как можно Я пишу универсальный считыватель c STL, который читает любой файл, в любом формате, без предварительного указания? Возможно ли это вообще?

2) Как я могу прочитать данные с плавающей запятой и экспоненциальные данные из файла различной длины, что можно наблюдать в строке

1.250000e+02 7.500000e+01 5.000000e+01 

3) Я пытался чтение информации в каждой строке в виде размещаемой символьной строки и, по-видимому, было успешным, но когда я печатаю строку, чтобы проверить ее содержимое, вывод также выглядит хаотично c, как и раньше:

facet n
    ormal 1.000000e+00 0
      .000000e+00 0.000000
   e+00

I Я попробовал почти все команды чтения в следующих формах, меняя ширину и цифры формата во многих, многих комбинациях, но ничего не помогло.

read(iunit, fmt= '(a, G8.6, G8.6, G8.6)', iostat=ios) vertex, vertices(1,k), vertices(1,k+1), vertices(1,k+2)
read(iunit, fmt= '(a, F2.0, E2.0, E2.0)', iostat=ios) vertex, vertices(1,k), vertices(1,k+1), vertices(1,k+2)
read(iunit, fmt= '(a, E10.6, E10.6, E10.6)', iostat=ios) vertex, vertices(1,k), vertices(1,k+1), vertices(1,k+2)

Может кто-нибудь, пожалуйста, помогите мне разобраться с эти вопросы форматирования? Любая помощь очень ценится, так как я боролся с этой проблемой в течение достаточно долгого времени.

...