Heute haben wir uns mit der sauberen Sortierung der Listen bzw. Tupel mit den Eckpunkten beschäftigt. Denn diese mpssen zunächst formatiert werden, damit unser Programm vernünftig funktioniert. Unser aktueller Code besteht aus zwei Programmen.
Das Programm „raw“ bereitet die Listen so um, dass sie mit dem anderen Programm als stl-Datei dargetsllt und gespeichert werden kann:
def raw_list_to_cooked_list(raw_list): """Bekommt eine Liste mit mehreren benen von Listen uebergeben und gibt eine liste zurueck, die aus Listen mit je 8 Eintraegen besteht. Bedingung: Es sind keine der Tupel, die am Ende in die neue Liste sollen, auf der ersten Ebene. Und es sind immer exakt 8 Tupel in einer liste """ cut_list=[] cooked_list=[] for l2 in raw_list: if type(l2)==tuple: cut_list.append(l2) elif type(l2)==list: for l3 in l2: if type(l3)==tuple: cut_list.append(l3) elif type(l3)==list: for l4 in l3: if type(l4)==tuple: cut_list.append(l4) elif type(l4)==list: for l5 in l4: if type(l5)==tuple: cut_list.append(l5) elif type(l5)==list: print "Warnung: Zu tiefe gehende Liste!" merk_liste=[] for eintrag in cut_list: merk_liste.append(eintrag) if len(merk_liste)==8: cooked_list.append(merk_liste) merk_liste=[] return cooked_list raum =[[(5.0, -1.5, -2.35), (5.0, -1.5, -2.65), (-5.0, -1.5, -2.65), (-5.0, -1.5, -2.35), (5.0, 1.5, -2.35), (5.0, 1.5, -2.65), (-5.0, 1.5, -2.65),(-5.0, 1.5, -2.35)], [(5.0, -1.5, 2.65), (5.0, -1.5, 2.35), (-5.0, -1.5, 2.35), (-5.0, -1.5, 2.65), (5.0, 1.5, 2.65), (5.0, 1.5, 2.35), (-5.0, 1.5, 2.35), (-5.0, 1.5, 2.65)], [ [(-4.561538461538461, -1.5, -1.9115384615384619), (-4.561538461538461, -1.5, -2.2115384615384617), (-5.438461538461539, -1.5, -2.2115384615384617), (-5.438461538461539, -1.5, -1.9115384615384619), (-4.561538461538461, 1.5, -1.9115384615384619),(-4.561538461538461, 1.5, -2.2115384615384617), (-5.438461538461539, 1.5, -2.2115384615384617), (-5.438461538461539, 1.5, -1.9115384615384619)], [(-4.4, -0.5, -0.8730769230769234), (-4.4, -0.5, -1.1730769230769234), (-5.6, -0.5, -1.1730769230769234), (-5.6, -0.5, -0.8730769230769234), (-4.4, 2.5, -0.8730769230769234), (-4.4, 2.5, -1.1730769230769234), (-5.6, 2.5, -1.1730769230769234), (-5.6, 2.5, -0.8730769230769234)], [(-3.5384615384615383, -1.5, 1.1884615384615378), (-3.5384615384615383, -1.5, 0.8884615384615379), (-6.461538461538462, -1.5, 0.8884615384615379), (-6.461538461538462, -1.5, 1.1884615384615378), (-3.5384615384615383, 1.5, 1.1884615384615378), (-3.5384615384615383, 1.5, 0.8884615384615379), (-6.461538461538462, 1.5, 0.8884615384615379), (-6.461538461538462, 1.5, 1.1884615384615378)] ], [ [(6.0, -1.5, -1.35), (6.0, -1.5, -1.65), (4.0, -1.5, -1.65), (4.0, -1.5, -1.35), (6.0, 1.5, -1.35), (6.0, 1.5, -1.65), (4.0, 1.5, -1.65), (4.0,1.5, -1.35)], [(5.5, -2.5, 0.15), (5.5, -2.5, -0.15), (4.5, -2.5, -0.15), (4.5, -2.5, 0.15), (5.5, 0.5, 0.15), (5.5, 0.5, -0.15), (4.5, 0.5, -0.15), (4.5, 0.5, 0.15)], [(6.0, -1.5, 1.65), (6.0, -1.5, 1.35), (4.0, -1.5, 1.35), (4.0, -1.5, 1.65), (6.0, 1.5, 1.65), (6.0, 1.5, 1.35), (4.0, 1.5, 1.35), (4.0, 1.5, 1.65)], [(5.5, -0.5, 0.15), (5.5, -0.5, -0.15), (4.5, -0.5, -0.15), (4.5, -0.5, 0.15), (5.5, 2.5, 0.15), (5.5, 2.5, -0.15), (4.5, 2.5, -0.15), (4.5, 2.5, 0.15)] ] ] if __name__ == "__main__": neu = raw_list_to_cooked_list(raum) print neu
In „stl, was wirklich funktioniert“ wird raw aufgerufen und die stl-Datei erstellt:
# -*- coding: utf-8 -*- from __future__ import division from __future__ import print_function #from visual import * import numpy as np import stl from stl import mesh from matplotlib import pyplot from raw import * # Listen von je drei Punkten, aus denen ein Dreieck gemacht werden soll faces = np.array([[4,6,7], [5,4,6], [5,6,2], [5,2,6], [3,0,7], [0,7,4], [0,1,2], [0,2,3], [2,3,6], [3,6,7], [0,1,4], [1,4,5]]) def eckpunkte_to_cube(liste, faces): for n, vertices in enumerate(liste): cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype)) for i, f in enumerate(faces): for j in range(3): print (i,j,f[j], type(f[j]), cube.vectors) cube.vectors[i][j] = vertices[int(f[j])] cube.save('cube'+str(n)+'.stl') raum = [ [(5.0, -1.5, -2.35), (5.0, -1.5, -2.65), (-5.0, -1.5, -2.65), (-5.0, -1.5, -2.35), (5.0, 1.5, -2.35), (5.0, 1.5, -2.65), (-5.0, 1.5, -2.65),(-5.0, 1.5, -2.35)], [(5.0, -1.5, 2.65), (5.0, -1.5, 2.35), (-5.0, -1.5, 2.35), (-5.0, -1.5, 2.65), (5.0, 1.5, 2.65), (5.0, 1.5, 2.35), (-5.0, 1.5, 2.35), (-5.0, 1.5, 2.65)], [(-4.561538461538461, -1.5, -1.9115384615384619), (-4.561538461538461, -1.5, -2.2115384615384617), (-5.438461538461539, -1.5, -2.2115384615384617), (-5.438461538461539, -1.5, -1.9115384615384619), (-4.561538461538461, 1.5, -1.9115384615384619),(-4.561538461538461, 1.5, -2.2115384615384617), (-5.438461538461539, 1.5, -2.2115384615384617), (-5.438461538461539, 1.5, -1.9115384615384619)], [(-4.4, -0.5, -0.8730769230769234), (-4.4, -0.5, -1.1730769230769234), (-5.6, -0.5, -1.1730769230769234), (-5.6, -0.5, -0.8730769230769234), (-4.4, 2.5, -0.8730769230769234), (-4.4, 2.5, -1.1730769230769234), (-5.6, 2.5, -1.1730769230769234), (-5.6, 2.5, -0.8730769230769234)], [(-3.5384615384615383, -1.5, 1.1884615384615378), (-3.5384615384615383, -1.5, 0.8884615384615379), (-6.461538461538462, -1.5, 0.8884615384615379), (-6.461538461538462, -1.5, 1.1884615384615378), (-3.5384615384615383, 1.5, 1.1884615384615378), (-3.5384615384615383, 1.5, 0.8884615384615379), (-6.461538461538462, 1.5, 0.8884615384615379), (-6.461538461538462, 1.5, 1.1884615384615378)], [(6.0, -1.5, -1.35), (6.0, -1.5, -1.65), (4.0, -1.5, -1.65), (4.0, -1.5, -1.35), (6.0, 1.5, -1.35), (6.0, 1.5, -1.65), (4.0, 1.5, -1.65), (4.0,1.5, -1.35)], [(5.5, -2.5, 0.15), (5.5, -2.5, -0.15), (4.5, -2.5, -0.15), (4.5, -2.5, 0.15), (5.5, 0.5, 0.15), (5.5, 0.5, -0.15), (4.5, 0.5, -0.15), (4.5, 0.5, 0.15)], [(6.0, -1.5, 1.65), (6.0, -1.5, 1.35), (4.0, -1.5, 1.35), (4.0, -1.5, 1.65), (6.0, 1.5, 1.65), (6.0, 1.5, 1.35), (4.0, 1.5, 1.35), (4.0, 1.5, 1.65)], [(5.5, -0.5, 0.15), (5.5, -0.5, -0.15), (4.5, -0.5, -0.15), (4.5, -0.5, 0.15), (5.5, 2.5, 0.15), (5.5, 2.5, -0.15), (4.5, 2.5, -0.15), (4.5, 2.5, 0.15)] ] test_liste = raw_list_to_cooked_list(raum) eckpunkte_to_cube(test_liste, faces)