Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2011 14:02:39

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

распарсить stl файли

имеется 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)

Офлайн

#2 Дек. 22, 2011 18:54:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

распарсить stl файли

infile=open('test1.stl','r').read()
parseString как следует из названия принимает string

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



Офлайн

#3 Дек. 22, 2011 21:02:20

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

распарсить stl файли

Спасибо!

А не подскажите как распарсенные данные передать в массив 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']]



Офлайн

#4 Дек. 23, 2011 07:14:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

распарсить stl файли

numpy не поддерживает последовательное добавлене. Потому лучще сначала сделать список нужной формы
а потом сделать numpy.array([,])
а списки получить добавив операции addparseaction
если не разберетесь в доке pyparsing- пишите. Да там у них на сайте книга рекламируется ее легко в инете найти. пользовал ее и конечно исходники парсера



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version