Найти - Пользователи
Полная версия: распарсить stl файли
Начало » Python для новичков » распарсить stl файли
1
dd67
имеется stl файл хранящий координаты площадок и их нормали, требуется считать числа в единый массив типа numpy.array((N,12),dtype'd').

Формат файла
$ head -15 test1.stl 
solid Created by Gmsh
facet normal 0 -0 -1
outer loop
vertex -2.74257 -1.88725 0
vertex -1 -3.8 0
vertex -3 -4.4 0
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -5 -5.55112e-12 0
vertex -2.74257 -1.88725 0
vertex -5 -2.5 0
endloop
endfacet
...
построить регулярное выражение мне удалось, но правильно распознать содержимое файла нет.

$ cat stl2raw.py 
#!/usr/bin/python
from pyparsing import *
d=Word(nums+".-")
rec="facet normal"+d+d+d+"outer loop"+"vertex"+d+d+d+"vertex"+d+d+d+"vertex"+d+d+d+"end loop"+"endfacet"

print "* TEST"
print rec.parseString("facet normal 1 0 0 outer loop vertex 11.2 2.1. -1.1 vertex 11.1 0.0 -1.1 vertex -1 -1 -1 end loop endfacet")
print "* end TEST"

datafile=OneOrMore(Group(rec))
infile=open('test1.stl','r')
datafile.parseString(infile)

$ ./stl2raw.py
* TEST
['facet normal', '1', '0', '0', 'outer loop', 'vertex', '11.2', '2.1.', '-1.1', 'vertex', '11.1', '0.0', '-1.1', 'vertex', '-1', '-1', '-1', 'end loop', 'endfacet']
* end TEST
Traceback (most recent call last):
File "./stl2raw.py", line 12, in <module>
datafile.parseString(infile)
File "/usr/lib/pymodules/python2.7/pyparsing.py", line 1068, in parseString
instring = instring.expandtabs()
AttributeError: 'file' object has no attribute 'expandtabs'
doza_and
infile=open('test1.stl','r').read()
parseString как следует из названия принимает string

А дальше у вас не парсится - ошибки в анализаторе.
end loop и endloop это разные вещи
Чтобы строить выражение используйте Suppress или AddParseAction
dd67
Спасибо!

А не подскажите как распарсенные данные передать в массив Nx12 типа numpy.array((N,12),dtype='d').

$ cat test.stl 
solid Created by Gmsh
facet normal 0 -0 -1
outer loop
vertex -2.74257 -1.88725 0
vertex -1 -3.8 0
vertex -3 -4.4 0
endloop
endfacet
facet normal 0 0 -1
outer loop
vertex -5 -5.55112e-12 0
vertex -2.74257 -1.88725 0
vertex -5 -2.5 0
endloop
endfacet
endsolid Created by Gmsh

$ cat stl2raw-ver2.py
#!/usr/bin/python
from pyparsing import *
d=Word(nums+".-e")
rec="facet normal"+d+d+d+"outer loop"+"vertex"+d+d+d+"vertex"+d+d+d+"vertex"+d+d+d+"endloop"+"endfacet"

w=Word(alphas+" ")
datafile=Group("solid" + w + OneOrMore(Group(rec)) + "endsolid " + w)
infile=open('test.stl','r')
print datafile.parseString(infile.read())

t$ ./stl2raw-ver2.py
[['solid', 'Created by Gmsh', ['facet normal', '0', '-0', '-1', 'outer loop', 'vertex', '-2.74257', '-1.88725', '0', 'vertex', '-1', '-3.8', '0', 'vertex', '-3', '-4.4', '0', 'endloop', 'endfacet'], ['facet normal', '0', '0', '-1', 'outer loop', 'vertex', '-5', '-5.55112e-12', '0', 'vertex', '-2.74257', '-1.88725', '0', 'vertex', '-5', '-2.5', '0', 'endloop', 'endfacet'], 'endsolid ', 'Created by Gmsh']]
doza_and
numpy не поддерживает последовательное добавлене. Потому лучще сначала сделать список нужной формы
а потом сделать numpy.array([,])
а списки получить добавив операции addparseaction
если не разберетесь в доке pyparsing- пишите. Да там у них на сайте книга рекламируется ее легко в инете найти. пользовал ее и конечно исходники парсера
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB