Форум сайта python.su
имеется 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'
Отредактировано (Дек. 22, 2011 14:39:24)
Офлайн
infile=open('test1.stl','r').read()
Офлайн
Спасибо!
А не подскажите как распарсенные данные передать в массив 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']]
Офлайн
numpy не поддерживает последовательное добавлене. Потому лучще сначала сделать список нужной формы
а потом сделать numpy.array([,])
а списки получить добавив операции addparseaction
если не разберетесь в доке pyparsing- пишите. Да там у них на сайте книга рекламируется ее легко в инете найти. пользовал ее и конечно исходники парсера
Офлайн