This is a file from the Wikimedia Commons
From Wikipedia, the free encyclopedia
Jump to navigationJump to search

Original file(5,120 × 2,880 pixels, file size: 181 KB, MIME type: application/sla)

View Diamond lattice.stl  on viewstl.com

Summary

#!/usr/bin/env pythonheader = 'A model of a diamond lattice comprising 2 x 2 x 2 unit cells by CMG Lee.'import re, struct, mathdef fmt(string): ## string.format(**vars()) using tags {expression!format} by CMG Lee def f(tag): i_sep = tag.rfind('!'); return (re.sub('\.0+$', '', str(eval(tag[1:-1]))) if (i_sep < 0) else ('{:%s}' % tag[i_sep + 1:-1]).format(eval(tag[1:i_sep]))) return (re.sub(r'(?<!{){[^{}]+}', lambda m:f(m.group()), string) .replace('{{', '{').replace('}}', '}'))def append(obj, string): return obj.append(fmt(string))def tabbify(cellss, separator='|'): cellpadss = [list(rows) + [''] * (len(max(cellss, key=len)) - len(rows)) for rows in cellss] fmts = ['%%%ds' % (max([len(str(cell)) for cell in cols])) for cols in zip(*cellpadss)] return '\n'.join([separator.join(fmts) % tuple(rows) for rows in cellpadss])def hex_rgb(colour): ## convert [#]RGB to #RRGGBB and [#]RRGGBB to #RRGGBB return '#%s' % (colour if len(colour) > 4 else ''.join([c * 2 for c in colour])).lstrip('#')def viscam_colour(colour): colour_hex = hex_rgb(colour) colour_top5bits = [int(colour_hex[i:i+2], 16) >> 3 for i in range(1,7,2)] return (1 << 15) + (colour_top5bits[0] << 10) + (colour_top5bits[1] << 5) + colour_top5bits[2]def roundm(x, multiple=1): if (isinstance(x, tuple)): return tuple(roundm(list(x), multiple)) elif (isinstance(x, list )): return [roundm(x_i, multiple) for x_i in x] else: return int(math.floor(float(x) / multiple + 0.5)) * multipledef rotate(facetss, deg_x, deg_y, deg_z): ## around x then y then z axes (sin_x, cos_x) = (math.sin(math.radians(deg_x)), math.cos(math.radians(deg_x))) (sin_y, cos_y) = (math.sin(math.radians(deg_y)), math.cos(math.radians(deg_y))) (sin_z, cos_z) = (math.sin(math.radians(deg_z)), math.cos(math.radians(deg_z))) facet_rotatess = [] for facets in facetss: facet_rotates = [] for i_point in range(4): (x, y, z) = [facets[3 * i_point + i_xyz] for i_xyz in range(3)] if (x is None or y is None or z is None): facet_rotates += [x, y, z] else: (y, z) = (y * cos_x - z * sin_x, y * sin_x + z * cos_x) ## rotate about x (x, z) = (x * cos_y + z * sin_y, -x * sin_y + z * cos_y) ## rotate about y (x, y) = (x * cos_z - y * sin_z, x * sin_z + y * cos_z) ## rotate about z facet_rotates += [round(value, 9) for value in [x, y, z]] facet_rotatess.append(facet_rotates) return facet_rotatessdef translate(facetss, dx, dy, dz): ds = [dx, dy, dz] return [facets[:3] + [facets[3 * i_point + i_xyz] + ds[i_xyz] for i_point in range(1,4) for i_xyz in range(3)] for facets in facetss]## Add facetsfacet_stickss = [[None,0,0, -2,10,10, -40,40,48, -10, 2,10], [None,0,0, -10, 2,10, -48,40,40, -10,10, 2], [None,0,0, -10,10, 2, -40,48,40, -2,10,10]]facet_stickss += translate(rotate(translate(facet_stickss, 25,-25,-25), 90,-90,90), -25,25,25)facet_stickss += rotate(facet_stickss, 0, 0,180)facet_stickss += rotate(facet_stickss, 0,180, 0)facet_ball_triangless = [[None,0,0, 12,12,0, 0,12,12, 12,0,12]]facet_ball_triangless += rotate(facet_ball_triangless , 90, 0, 0)facet_ball_triangless += rotate(facet_ball_triangless , 180, 0, 0)facet_ball_triangless += rotate(facet_ball_triangless , 0,180, 0)facet_ball_diamondss = [[None,0,0, 17,0,0, 12,12,0, 12,0,12]]facet_ball_diamondss += rotate(facet_ball_diamondss , 180, 0, 0)facet_ball_diamondss += rotate(facet_ball_diamondss , 90, 0, 0)facet_ball_diamondss += rotate(facet_ball_diamondss , 0,180, 0)facet_ball_diamondss += rotate(facet_ball_diamondss , 0, 90, 0)facet_ball_diamondss += rotate(facet_ball_diamondss[:8], 0, 0,90)facet_ballss = facet_ball_diamondss + facet_ball_trianglessfacet_stick_ballss = facet_stickss + facet_ballssfacet_cell_1ss = (translate(facet_ballss,100,100,0) + translate(facet_stick_ballss, 50,50,50))facet_cell_1ss += translate(facet_cell_1ss, 100,100,0)facet_cell_2ss = (translate(facet_ballss,200,100,100) + translate(facet_stick_ballss, 150,50,150))facet_cell_2ss += translate(facet_cell_2ss, -100,100,0)facet_cellss = facet_cell_1ss + facet_cell_2ssfacetss = facet_cellssfacetss += translate(facetss, 200, 0, 0)facetss += translate(facetss, 0,200, 0)facetss += translate(facetss, 0, 0,200)facetss += (facet_ballss + translate(facet_ballss, 0,200, 0) + translate(facet_ballss, 0,100,100) + translate(facet_ballss, 0,300,100) + translate(facet_ballss, 0, 0,200) + translate(facet_ballss, 0,200,200) + translate(facet_ballss, 0,400,200) + translate(facet_ballss, 0,100,300) + translate(facet_ballss, 0,300,300) + translate(facet_ballss, 0,200,400) + translate(facet_ballss, 0,400,400) + translate(facet_ballss, 200, 0, 0) + translate(facet_ballss, 100, 0,100) + translate(facet_ballss, 300, 0,100) + translate(facet_ballss, 0, 0,200) + translate(facet_ballss, 200, 0,200) + translate(facet_ballss, 400, 0,200) + translate(facet_ballss, 100, 0,300) + translate(facet_ballss, 300, 0,300) + translate(facet_ballss, 200, 0,400) + translate(facet_ballss, 400, 0,400) + translate(facet_ballss, 100,100,400) + translate(facet_ballss, 100,300,400) + translate(facet_ballss, 200,200,400) + translate(facet_ballss, 300,100,400) + translate(facet_ballss, 400,200,400) + translate(facet_ballss, 300,300,400) + translate(facet_ballss, 200,400,400) )## Calculate normalsfor facets in facetss: if (facets[0] is None or facets[1] is None or facets[2] is None): us = [facets[i_xyz + 9] - facets[i_xyz + 6] for i_xyz in range(3)] vs = [facets[i_xyz + 6] - facets[i_xyz + 3] for i_xyz in range(3)] normals = [us[1]*vs[2] - us[2]*vs[1], us[2]*vs[0] - us[0]*vs[2], us[0]*vs[1] - us[1]*vs[0]] normal_length = sum([component * component for component in normals]) ** 0.5 facets[:3] = [round(component / normal_length, 10) for component in normals]# print(tabbify([['%s%d' % (xyz, n) for n in range(3) for xyz in list('XYZ')] +# ['N%s'  % (xyz) for xyz in list('xyz')] + ['s0f']] + facetss))## Compile STLoutss = ([['STL\n\n%-73s\n\n' % (header[:73]), struct.pack('<L', len(facetss))]] + [[struct.pack('<f', float(value)) for value in facets[:12]] + [struct.pack('<H', 0 if (len(facets) <= 12) else viscam_colour(facets[12]))] for facets in facetss])out = ''.join([out for outs in outss for out in outs])print('# bytes:%d\t# facets:%d\ttitle: %s' % (len(out), len(facetss), header[:73]))with open(__file__[:__file__.rfind('.')] + '.stl', 'wb') as f_out: f_out.write(out) # f_out.write('%s\n## Python script to generate STL\n%s\n' % (''.join(outs), open(__file__).read()))

Licensing

I, the copyright holder of this work, hereby publish it under the following license:

Captions

Add a one-line explanation of what this file represents

Items portrayed in this file

depicts

18 March 2018

File history

Click on a date/time to view the file as it appeared at that time.

The following pages on the English Wikipedia use this file (pages on other projects are not listed):

Global file usage

The following other wikis use this file:

  • Usage on as.wikipedia.org
    • সাঁচ:Infobox mineral
    • সাঁচ:Infobox mineral/doc
  • Usage on bh.wikipedia.org
    • टेम्पलेट:Infobox mineral
    • टेम्पलेट:Infobox mineral/doc
  • Usage on fi.wikipedia.org
    • Bravais’n hila
  • Usage on www.wikidata.org
    • Q905169