#! / usr / bin / env pythonsolid_name = 'ASCII_STL_of_a_sphericon_by_CMG_Lee' n_face_side = 60 r = 1000importar re , io , math def fmt ( cadena ): ## string.format (** vars ()) usando etiquetas {formato! expresión} por CMG Lee def f ( etiqueta ): i_sep = etiqueta . rfind ( '!' ); return ( re . sub ( '\ .0 + $' , '' , str ( eval ( tag [ 1 : - 1 ]))) if ( i_sep < 0) else ( '{: % s }' % etiqueta [ i_sep + 1 : - 1 ]) . format ( eval ( tag [ 1 : i_sep ]))) return ( re . sub ( r '(? <! {) {[^ {} ] +}' , lambda m : f ( m . group ()), string ) . reemplazar ( '{{' , '{') . replace ( '}}' , '}' )) def append ( obj , string ): return obj . append ( fmt ( cadena )) def tabbify ( celdas , separador = '|' ): celdas = [ lista ( filas ) + [ '' ] * ( len ( max ( celdas , clave =len )) - len ( filas )) para filas en celdas ] fmts = [ ' %%% d s' % ( max ([ len ( str ( celda )) para celda en columnas ])) para columnas en zip ( * celdas )] devuelve ' \ n ' . unirse ([ separador . unirse ( fmts ) % tupla ( filas ) para filas en celdas ]) def roundm ( x , multiple = 1 ): if ( isinstance ( x , tuple )): return tuple ( roundm ( list ( x ), multiple )) elif ( isinstance ( x , list )): return [ roundm ( x_i , multiple ) para x_i en x ] else : return int ( math . floor ( float ( x ) / multiple + 0.5 )) * multiplefacetss = [] ## Encuentra facetas para i_face_side en el rango ( n_face_side + 1 ): rad = math . pi * i_face_side / n_face_side ( r_sin , r_cos ) = roundm ([ r * function ( rad ) para la función en [ math . sin , math . cos ]]) if ( i_face_side > 0 ): facetas . añadir ([ 1000 + i_face_side , r , 0 , 0 , 0 , - r_cos_old , - r_sin_old , 0 , - r_cos , - r_sin ]) facetas . añadir ([ 2000 + i_face_side , - r , 0 , 0 , 0 , r_cos_old , - r_sin_old , 0 , r_cos , - r_sin ]) facetas . añadir ([ 3000 + i_face_side , 0 , r , 0 , - r_cos_old , 0 , r_sin_old , - r_cos , 0 , r_sin ]) facetass . añadir ([ 4000 + i_face_side , 0 , - r , 0 , r_cos_old , 0 , r_sin_old , r_cos , 0 , r_sin ]) ( r_sin_old , r_cos_old ) = ( r_sin , r_cos ) ## Calcular normales para facetas en facetss : nos = [ facetas [ i_xyz + 3 ] - facetas [ i_xyz ] para i_xyz en gama ( 3 ) ] vs = [ facetas [ i_xyz ] - facetas [ i_xyz + 6 ] para i_xyz en el rango ( 3 )] normales = [ us [ 1 ] * vs [ 2 ] - us [ 2 ] * vs [ 1 ], us [ 2 ] * vs [ 0 ] - us [ 0 ] * frente a [ 2 ], nosotros [ 0] * vs [ 1 ] - us [ 1 ] * vs [ 0 ]] longitud_normal = suma ([ componente * componente para componente en normales ]) ** 0.5 facetas + = [ ' % .5f ' % ( componente / longitud_normal ) para componente en normales ] facetas = ordenadas ( facetas) print ( tabbify ([[ 's.f' ] + [ ' % s% d ' % ( xyz , n ) para n en el rango ( 3 ) para xyz en la lista ( 'XYZ' )] + [ 'N % s ' % ( xyz ) para xyz en la lista ( 'xyz' )]] + facetas )) ## Compilar salidas STL = [fmt ( '' ' \ facet normal {facetas [10]} {facetas [11]} {facetas [12]} vértice del bucle externo {facetas [1]} {facetas [2]} {facetas [3]} vértice {facetas [4]} {facetas [5]} {facetas [6]} vértice {facetas [7]} {facetas [8]} {facetas [9]} endloop endfacet ''' ) para las facetas en facetss ] con io . open ( __file__ [: __file__ . rfind ( '.' )] + '.stl' , 'w' , nueva línea = ' \ n ' ) como f_out : f_out . write ( 'solid % s \ n % s \ n endsolid % s \ n \ n ## Por favor, mantenga la secuencia de comandos de Python debajo de \ n % s ' % ( solid_name , ' \ n ' . join ( outs ), solid_name , io . open ( __file__ ) . read ()))