Исходный файл (5120 × 2880 пикселей, размер файла: 181 КБ, тип MIME: application/sla )
Посмотреть Diamond grill.stl на viewstl.com
ОписаниеАлмазная решетка.stl | Русский: Модель алмазной решетки, включающей 2 x 2 x 2 элементарных ячеек, CMG Lee. Атомы представлены тетракискубооктаэдрами, а связи — треугольными антипризмами. |
Дата | |
Источник | Собственная работа |
Автор | Cmglee |
#!/usr/bin/env питонзаголовок = 'Модель алмазной решетки, состоящей из 2 x 2 x 2 элементарных ячеек, автор CMG Lee.'import re , struct , math def fmt ( string ): ## string.format(**vars()) с использованием тегов {expression!format} от 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 ( cells , Separater = '|' ): cellpadss = [ list ( rows ) + [ '' ] * ( len ( max ( cells , key = len )) - len ( rows )) для строк в ячейках ] fmts = [ ' %%%d s' % ( max ([ len ( str ( cell )) для ячейки в столбцах ])) для столбцов в zip ( * cellpadss )] return ' \n ' . join ([ Separater . join ( fmts ) % tuple ( rows ) для строк в cellpadss ]) def hex_rgb ( colour ): ## преобразовать [#]RGB в #RRGGBB и [#]RRGGBB в #RRGGBB return '# %s ' % ( colour if len ( colour ) > 4 else '' . join ([ c * 2 for c in colour ])) . lstrip ( '#' ) def viscam_colour ( color ): colour_hex = hex_rgb ( color ) colour_top5bits = [ int ( color_hex [ i : i + 2 ], 16 ) >> 3 for i in range ( 1,7,2 ) ] return ( 1 << 15 ) + ( color_top5bits [ 0 ] << 10 ) + ( color_top5bits [ 1 ] << 5 ) + color_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)) ## Компиляция STL outss = ([[ '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 \t title: %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 для генерации STL\n%s\n' % (''.join(outs), open(__file__).read()))
Загрузчик этого файла согласился с лицензией Wikimedia Foundation на 3D-патент: Этот файл и любые 3D-объекты, изображенные в файле, являются моей собственной работой. Настоящим я предоставляю каждому пользователю, производителю или дистрибьютору объекта, изображенного в файле, всемирную, безвозмездную, полностью оплаченную, неисключительную, безотзывную и бессрочную лицензию без дополнительных затрат по любому патенту или патентной заявке, которой я владею сейчас или в будущем, на создание, создание, использование, предложение для продажи, продажу, импорт и распространение этого файла и любых 3D-объектов, изображенных в файле, которые в противном случае нарушали бы любые притязания на любые патенты, которыми я владею сейчас или в будущем. Обратите внимание, что в случае каких-либо различий в значении или толковании между оригинальной английской версией данной лицензии и переводом, преимущественную силу имеет оригинальная английская версия. |
Нажмите на дату/время, чтобы просмотреть файл в том виде, в котором он был в тот момент.
Дата/Время | Миниатюра | Размеры | Пользователь | Комментарий | |
---|---|---|---|---|---|
текущий | 00:14, 19 марта 2018 г. | 5,120 × 2,880 (181 КБ) | Cmglee | Пользователь создал страницу с помощью UploadWizard |
Этот файл используется на следующих 9 страницах:
Этот файл используют и другие вики: