LINUX.ORG.RU

распарсить stl-файл (Питон)


0

1

stl файл хранит координаты вершин площадок и нормали к ним:

$ 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
...

помогите распарсить файл по шаблону и превратить в массив вещественных чисел (N,12), в котором храняться 9-ть координат вершин и 3 компоненты нормали. Пока удалось распознавать записи facet ... endfacet. Но извлечь их из файла и записать в массив не удается.

#!/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+"end loop"+"endfacet"

print rec.parseString("facet normal 1 0 0 outer loop vertex 11.2e-10 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)

#data=open('test1.stl','r').readlines()
#print data
#print rec.parseString(data)

Вот это выдаёт поиск по запросу «python Stereo-Lithographic». Не поможет?

schizoid ★★★ ()

Что это за stl я не знаю, но с Вас ящик Асти-Мартини:

result = []
for l in open('test.stl') :
    l = l.split()
    if l[0] == 'facet' : result.append(map( float, l[-3:] ))
    elif l[0] == 'vertex' : result[-1] += map( float, l[-3:] )
print result

tmp$ python test.py
[[0.0, -0.0, -1.0, -2.7425700000000002, -1.8872500000000001, 0.0, -1.0, -3.7999999999999998, 0.0, -3.0, -4.4000000000000004, 0.0], [0.0, 0.0, -1.0, -5.0, -5.5511199999999999e-12, 0.0, -2.7425700000000002, -1.8872500000000001, 0.0, -5.0, -2.5, 0.0]]
AIv ★★★★★ ()
Ответ на: комментарий от AIv

Мля вот я лошара. Как я это на Perl-е расковыривал (((

sub create_model ()
{
$num_versh=0;
$numm_versh2=0;
$model_index=0;
$old_model_index=-1;
open(STLMODEL, "< ./in_model/$file") or die "can't open stl-model";
while($line=<STLMODEL>)
	{
	if($line=~m/normal\s/o)
		{
		$before=$`;
		$seredina=$&;	
		$after=$';
		$i=0;		
		while($i<3)
			{
			if($after=~m/\S+\s*/o)
 				{
				$before=$`;
				$seredina=$&;	
				$after=$';
				$normal[$i]=$&+0;
				$i++;				
				};			
			};		
		};	


	if($line=~m/vertex\s/o)
		{
		$before=$`;
		$seredina=$&;	
		$after=$';
		$i=0;		
		while($i<3)
		{
			if($after=~m/\S+\s*/o)
				{
				$before=$`;
				$seredina=$&;	
				$after=$';
				$coordinates[$num_versh]=$&+0;
				$num_versh++;
				if($num_versh>8)
					{
					$num_versh=0;
					$model[$model_index]= [@coordinates];
			 $model_index++;				
					create_triangle(@coordinates);				
					}
				}
		$i++;		
		}
		}	
	}

unname ()
Ответ на: комментарий от unname

О_О... Я знал что питон лучше перла, но и представить не мог что настолько... ;-)

AIv ★★★★★ ()
Ответ на: комментарий от unname

о_О

как круто ты развернул пару строчек…

#!/usr/bin/perl

use strict;
use Data::Dumper;

open my $fh, '<test1.stl' or die $!;
my @t;
/(normal|vertex)\s+(\S+)\s+(\S+)\s+(\S+)/ and ($1 eq 'normal' and push @t, [$2,$3,$4] or push $t[-1], $2,$3,$4) for <$fh>;
print Dumper \@t;
arsi ★★★★★ ()
Ответ на: комментарий от arsi

ну всегда полезно открывать новые функции, как то даже не задумывался) Ладно менять всеравно не буду ничего три года уже работает, а еще писанины выше крыши, а сроки уже вот они...

unname ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.