2009-05-11 05:10:09 +00:00
#!BPY
2009-05-22 12:31:27 +00:00
# -*- coding: latin-1 -*-
2009-05-11 05:10:09 +00:00
"""
Name : ' Bolt Factory '
2009-05-22 12:31:27 +00:00
Blender : 248
2009-05-11 05:10:09 +00:00
Group : ' Wizards '
2009-05-22 12:31:27 +00:00
Tooltip : ' Create models of various types of screw fasteners. '
2009-05-11 05:10:09 +00:00
"""
__author__ = " Aaron Keith (Spudmn) "
2009-06-11 10:46:13 +00:00
__version__ = " 2.02 2009/06/10 "
2009-05-22 12:31:27 +00:00
__url__ = [ " Author ' s site,http://sourceforge.net/projects/boltfactory/ " , " Blender,http://wiki.blender.org/index.php/Extensions:Py/Scripts/Manual/Misc/Bolt_Factory " ]
2009-05-11 05:10:09 +00:00
__bpydoc__ = """ \
Bolt_Factory . py
Bolt Factory is a Python script for Blender 3 D .
2009-05-22 12:31:27 +00:00
The script allows the user to create models of various types of screw fasteners .
2009-05-11 05:10:09 +00:00
For best results set the material to smooth and apply a Edge Split modifier
with default settings .
2009-05-22 12:31:27 +00:00
History :
2009-06-11 10:46:13 +00:00
V2 .02 10 / 06 / 09 by Aaron Keith
- Added changes made by the Blender team .
V2 .01 26 / 05 / 09 by Aaron Keith
- Fixed normal ' s on Lock Nut
2009-05-22 12:31:27 +00:00
V2 .00 22 / 05 / 09 by Aaron Keith
- Better error checking .
- Lock Nut and Hex Nut meshes added .
- Pre - sets for common metric bolts and nuts .
- Improved GUI .
- Meshes scaled to a smaller size
- Fixed bug when using crest and root percent other than 10 %
- Can now create meshes in Edit Mode . This will add to the
current mesh and align with the current view .
V1 .00 01 / 04 / 08 by Aaron Keith
- This version is very much a work in progress .
- This is my first attempt to program in Python . This version is
unpolished and doesn ' t do much error checking. Therefore
if the user sets strange variable the model created will be
as equally strange .
- To Do :
- Better error checking .
- More Head and Bit types .
- Better documentation .
2009-05-11 05:10:09 +00:00
"""
# --------------------------------------------------------------------------
# Bolt_Factory.py
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
2009-05-22 12:31:27 +00:00
# Copyright (C) 2009: Aaron Keith
2009-05-11 05:10:09 +00:00
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
import Blender
from Blender import Draw , BGL , Mesh
from Blender import *
from math import *
from Blender import Mathutils
from Blender . Mathutils import *
2009-05-22 12:31:27 +00:00
#Global_Scale = 0.001 #1 blender unit = X mm
Global_Scale = 0.1 #1 blender unit = X mm
#Global_Scale = 1.0 #1 blender unit = X mm
2009-05-11 05:10:09 +00:00
Global_NutRad = 0.0
MAX_INPUT_NUMBER = 50
No_Event , On_Preset_Click , On_Apply_Click , On_Create_Click , On_Hex_Click , On_Cap_Click , On_Dome_Click , On_Pan_Click , On_Bit_None_Click , On_Bit_Allen_Click , On_Bit_Philips_Click , On_Exit_Click , On_Model_Bolt_Click , On_Model_Nut_Click , On_Hex_Nut_Click , On_Lock_Nut_Click , On_Test_Click = range ( 17 ) # this is like a ENUM
2009-05-22 12:31:27 +00:00
Head_Type = { ' HEX ' : [ Draw . Create ( 1 ) , On_Hex_Click , " " ] ,
' CAP ' : [ Draw . Create ( 0 ) , On_Cap_Click , " " ] ,
' DOME ' : [ Draw . Create ( 0 ) , On_Dome_Click , " " ] ,
' PAN ' : [ Draw . Create ( 0 ) , On_Pan_Click , " " ] }
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Bit_Type = { ' NONE ' : [ Draw . Create ( 1 ) , On_Bit_None_Click , " " ] ,
' ALLEN ' : [ Draw . Create ( 0 ) , On_Bit_Allen_Click , " " ] ,
' PHILLIPS ' : [ Draw . Create ( 0 ) , On_Bit_Philips_Click , " " ] }
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Model_Type = { ' BOLT ' : [ Draw . Create ( 1 ) , On_Model_Bolt_Click , " Bolt Settings " ] ,
' NUT ' : [ Draw . Create ( 0 ) , On_Model_Nut_Click , " Nut Settings " ] }
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Nut_Type = { ' HEX ' : [ Draw . Create ( 1 ) , On_Hex_Nut_Click , " " ] ,
' LOCK ' : [ Draw . Create ( 0 ) , On_Lock_Nut_Click , " " ] }
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Phillips_Bit_Depth = Draw . Create ( 3.27 )
Philips_Bit_Dia = Draw . Create ( 5.20 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Allen_Bit_Depth = Draw . Create ( 4.0 )
Allen_Bit_Flat_Distance = Draw . Create ( 6.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Hex_Head_Height = Draw . Create ( 5.3 )
Hex_Head_Flat_Distance = Draw . Create ( 13.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Cap_Head_Dia = Draw . Create ( 13.5 )
Cap_Head_Height = Draw . Create ( 8.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Dome_Head_Dia = Draw . Create ( 16.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Pan_Head_Dia = Draw . Create ( 16.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Shank_Dia = Draw . Create ( 8.0 )
Shank_Length = Draw . Create ( 0.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Thread_Length = Draw . Create ( 16.0 )
Major_Dia = Draw . Create ( 8.0 )
Minor_Dia = Draw . Create ( 6.917 )
Pitch = Draw . Create ( 1.0 )
Crest_Percent = Draw . Create ( 10 )
Root_Percent = Draw . Create ( 10 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Hex_Nut_Height = Draw . Create ( 8.0 )
Hex_Nut_Flat_Distance = Draw . Create ( 13.0 )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Preset_Menu = Draw . Create ( 5 )
2009-05-11 05:10:09 +00:00
##########################################################################################
##########################################################################################
## Miscellaneous Utilities
##########################################################################################
##########################################################################################
2009-05-22 12:31:27 +00:00
# Returns a list of verts rotated by the given matrix. Used by SpinDup
2009-05-11 05:10:09 +00:00
def Rot_Mesh ( verts , matrix ) :
2009-05-22 12:31:27 +00:00
return [ list ( Vector ( v ) * matrix ) for v in verts ]
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
# Returns a list of faces that has there index incremented by offset
2009-05-11 05:10:09 +00:00
def Copy_Faces ( faces , offset ) :
ret = [ ]
for f in faces :
fsub = [ ]
for i in range ( len ( f ) ) :
fsub . append ( f [ i ] + offset )
ret . append ( fsub )
return ret
2009-05-22 12:31:27 +00:00
# Much like Blenders built in SpinDup.
2009-05-11 05:10:09 +00:00
def SpinDup ( VERTS , FACES , DEGREE , DIVISIONS , AXIS ) :
verts = [ ]
faces = [ ]
if DIVISIONS == 0 :
DIVISIONS = 1
step = DEGREE / DIVISIONS # set step so pieces * step = degrees in arc
2009-05-22 12:31:27 +00:00
for i in xrange ( int ( DIVISIONS ) ) :
2009-05-11 05:10:09 +00:00
rotmat = Mathutils . RotationMatrix ( step * i , 4 , AXIS ) # 4x4 rotation matrix, 30d about the x axis.
Rot = Rot_Mesh ( VERTS , rotmat )
faces . extend ( Copy_Faces ( FACES , len ( verts ) ) )
verts . extend ( Rot )
return verts , faces
2009-05-22 12:31:27 +00:00
# Returns a list of verts that have been moved up the z axis by DISTANCE
def Move_Verts_Up_Z ( VERTS , DISTANCE ) :
return [ [ v [ 0 ] , v [ 1 ] , v [ 2 ] + DISTANCE ] for v in VERTS ]
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
# Returns a list of verts and faces that has been mirrored in the AXIS
2009-05-11 05:10:09 +00:00
def Mirror_Verts_Faces ( VERTS , FACES , AXIS , FLIP_POINT = 0 ) :
ret_vert = [ ]
ret_face = [ ]
offset = len ( VERTS )
if AXIS == ' y ' :
for v in VERTS :
Delta = v [ 0 ] - FLIP_POINT
ret_vert . append ( [ FLIP_POINT - Delta , v [ 1 ] , v [ 2 ] ] )
if AXIS == ' x ' :
for v in VERTS :
Delta = v [ 1 ] - FLIP_POINT
ret_vert . append ( [ v [ 0 ] , FLIP_POINT - Delta , v [ 2 ] ] )
if AXIS == ' z ' :
for v in VERTS :
Delta = v [ 2 ] - FLIP_POINT
ret_vert . append ( [ v [ 0 ] , v [ 1 ] , FLIP_POINT - Delta ] )
for f in FACES :
fsub = [ ]
for i in range ( len ( f ) ) :
fsub . append ( f [ i ] + offset )
2009-05-22 12:31:27 +00:00
fsub . reverse ( ) # flip the order to make norm point out
2009-05-11 05:10:09 +00:00
ret_face . append ( fsub )
return ret_vert , ret_face
2009-05-22 12:31:27 +00:00
# Returns a list of faces that
# make up an array of 4 point polygon.
2009-05-11 05:10:09 +00:00
def Build_Face_List_Quads ( OFFSET , COLUM , ROW , FLIP = 0 ) :
Ret = [ ]
RowStart = 0 ;
for j in range ( ROW ) :
for i in range ( COLUM ) :
Res1 = RowStart + i ;
Res2 = RowStart + i + ( COLUM + 1 )
Res3 = RowStart + i + ( COLUM + 1 ) + 1
Res4 = RowStart + i + 1
if FLIP :
Ret . append ( [ OFFSET + Res1 , OFFSET + Res2 , OFFSET + Res3 , OFFSET + Res4 ] )
else :
Ret . append ( [ OFFSET + Res4 , OFFSET + Res3 , OFFSET + Res2 , OFFSET + Res1 ] )
RowStart + = COLUM + 1
return Ret
2009-05-22 12:31:27 +00:00
# Returns a list of faces that makes up a fill pattern for a
# circle
2009-05-11 05:10:09 +00:00
def Fill_Ring_Face ( OFFSET , NUM , FACE_DOWN = 0 ) :
Ret = [ ]
Face = [ 1 , 2 , 0 ]
TempFace = [ 0 , 0 , 0 ]
A = 0
B = 1
C = 2
if NUM < 3 :
return None
for i in range ( NUM - 2 ) :
if ( i % 2 ) :
TempFace [ 0 ] = Face [ C ] ;
TempFace [ 1 ] = Face [ C ] + 1 ;
TempFace [ 2 ] = Face [ B ] ;
if FACE_DOWN :
Ret . append ( [ OFFSET + Face [ 2 ] , OFFSET + Face [ 1 ] , OFFSET + Face [ 0 ] ] )
else :
Ret . append ( [ OFFSET + Face [ 0 ] , OFFSET + Face [ 1 ] , OFFSET + Face [ 2 ] ] )
else :
TempFace [ 0 ] = Face [ C ] ;
if Face [ C ] == 0 :
TempFace [ 1 ] = NUM - 1 ;
else :
TempFace [ 1 ] = Face [ C ] - 1 ;
TempFace [ 2 ] = Face [ B ] ;
if FACE_DOWN :
Ret . append ( [ OFFSET + Face [ 0 ] , OFFSET + Face [ 1 ] , OFFSET + Face [ 2 ] ] )
else :
Ret . append ( [ OFFSET + Face [ 2 ] , OFFSET + Face [ 1 ] , OFFSET + Face [ 0 ] ] )
Face [ 0 ] = TempFace [ 0 ]
Face [ 1 ] = TempFace [ 1 ]
Face [ 2 ] = TempFace [ 2 ]
return Ret
2009-05-22 12:31:27 +00:00
##########################################################################################
##########################################################################################
## Converter Functions For Bolt Factory
##########################################################################################
##########################################################################################
2009-05-11 05:10:09 +00:00
def Flat_To_Radius ( FLAT ) :
h = ( float ( FLAT ) / 2 ) / cos ( radians ( 30 ) )
return h
2009-05-22 12:31:27 +00:00
def Get_Phillips_Bit_Height ( Bit_Dia ) :
Flat_Width_half = ( Bit_Dia * ( 0.5 / 1.82 ) ) / 2.0
Bit_Rad = Bit_Dia / 2.0
x = Bit_Rad - Flat_Width_half
y = tan ( radians ( 60 ) ) * x
return y
2009-05-11 05:10:09 +00:00
##########################################################################################
##########################################################################################
## Error Checking
##########################################################################################
##########################################################################################
def Error_Check ( ) :
#global Phillips_Bit_Depth
#global Philips_Bit_Dia
#global Allen_Bit_Depth
#global Allen_Bit_Flat_Distance
#global Hex_Head_Height
#global Hex_Head_Flat_Distance
#global Cap_Head_Dia
#global Cap_Head_Height
#global Dome_Head_Dia
#global Pan_Head_Dia
#global Shank_Dia
#global Shank_Length
global Thread_Length
global Major_Dia
global Minor_Dia
global Pitch
2009-05-22 12:31:27 +00:00
global Hex_Nut_Flat_Distance
global Model_Type
2009-05-11 05:10:09 +00:00
#global Crest_Percent
#global Root_Percent
Error_Result = 0
if Minor_Dia . val > = Major_Dia . val :
error_txt = " Error % t|Major Dia must be larger than Minor Dia "
Blender . Draw . PupMenu ( error_txt )
print error_txt
Error_Result = TRUE
2009-05-22 12:31:27 +00:00
elif ( Model_Type [ ' BOLT ' ] [ 0 ] . val ) and ( ( Pitch . val * 7.0 ) > Thread_Length . val ) :
error_txt = " Error % t|Thread length must be at least 7 times the Pitch "
Blender . Draw . PupMenu ( error_txt )
print error_txt
Error_Result = TRUE
elif ( Model_Type [ ' NUT ' ] [ 0 ] . val ) and ( Hex_Nut_Flat_Distance . val < Major_Dia . val ) :
error_txt = " Error % t|Nut Flat Distance must be greater than Major Dia "
Blender . Draw . PupMenu ( error_txt )
print error_txt
Error_Result = TRUE
elif ( Model_Type [ ' NUT ' ] [ 0 ] . val ) and ( ( Pitch . val * 2.5 ) > Hex_Nut_Height . val ) :
error_txt = " Error % t|Nut Height must be greater than 2.5 * Pitch "
2009-05-11 05:10:09 +00:00
Blender . Draw . PupMenu ( error_txt )
print error_txt
Error_Result = TRUE
2009-05-22 12:31:27 +00:00
elif ( Model_Type [ ' BOLT ' ] [ 0 ] . val ) :
Check_Head_Height = None
Check_Bit_Height = None
if ( Bit_Type [ ' ALLEN ' ] [ 0 ] . val ) :
Check_Bit_Height = Allen_Bit_Depth . val
if ( Bit_Type [ ' PHILLIPS ' ] [ 0 ] . val ) :
Check_Bit_Height = Phillips_Bit_Depth . val
if ( Head_Type [ ' HEX ' ] [ 0 ] . val ) :
Check_Head_Height = Hex_Head_Height . val
if ( Head_Type [ ' CAP ' ] [ 0 ] . val ) :
Check_Head_Height = Cap_Head_Height . val
if Check_Head_Height != None and Check_Bit_Height != None :
if Check_Bit_Height > Check_Head_Height :
error_txt = " Error % t|Bit Depth must not be greater that Head Height "
Blender . Draw . PupMenu ( error_txt )
print error_txt
Error_Result = TRUE
return Error_Result
2009-05-11 05:10:09 +00:00
##########################################################################################
##########################################################################################
## Create Allen Bit
##########################################################################################
##########################################################################################
def Allen_Fill ( OFFSET , FLIP = 0 ) :
faces = [ ]
Lookup = [ [ 19 , 1 , 0 ] ,
[ 19 , 2 , 1 ] ,
[ 19 , 3 , 2 ] ,
[ 19 , 20 , 3 ] ,
[ 20 , 4 , 3 ] ,
[ 20 , 5 , 4 ] ,
[ 20 , 6 , 5 ] ,
[ 20 , 7 , 6 ] ,
[ 20 , 8 , 7 ] ,
[ 20 , 9 , 8 ] ,
[ 20 , 21 , 9 ] ,
[ 21 , 10 , 9 ] ,
[ 21 , 11 , 10 ] ,
[ 21 , 12 , 11 ] ,
[ 21 , 13 , 12 ] ,
[ 21 , 14 , 13 ] ,
[ 21 , 15 , 14 ] ,
[ 21 , 22 , 15 ] ,
[ 22 , 16 , 15 ] ,
[ 22 , 17 , 16 ] ,
[ 22 , 18 , 17 ]
]
for i in Lookup :
if FLIP :
faces . append ( [ OFFSET + i [ 2 ] , OFFSET + i [ 1 ] , OFFSET + i [ 0 ] ] )
else :
faces . append ( [ OFFSET + i [ 0 ] , OFFSET + i [ 1 ] , OFFSET + i [ 2 ] ] )
return faces
2009-05-22 12:31:27 +00:00
def Allen_Bit_Dia ( FLAT_DISTANCE ) :
Flat_Radius = ( float ( FLAT_DISTANCE ) / 2.0 ) / cos ( radians ( 30 ) )
return ( Flat_Radius * 1.05 ) * 2.0
def Allen_Bit_Dia_To_Flat ( DIA ) :
Flat_Radius = ( DIA / 2.0 ) / 1.05
return ( Flat_Radius * cos ( radians ( 30 ) ) ) * 2.0
2009-05-11 05:10:09 +00:00
def Create_Allen_Bit ( FLAT_DISTANCE , HEIGHT ) :
Div = 36
verts = [ ]
faces = [ ]
2009-05-22 12:31:27 +00:00
Flat_Radius = ( float ( FLAT_DISTANCE ) / 2.0 ) / cos ( radians ( 30 ) )
2009-05-11 05:10:09 +00:00
OUTTER_RADIUS = Flat_Radius * 1.05
Outter_Radius_Height = Flat_Radius * ( 0.1 / 5.77 )
FaceStart_Outside = len ( verts )
Deg_Step = 360.0 / float ( Div )
for i in range ( ( Div / 2 ) + 1 ) : # only do half and mirror later
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , 0 ] )
FaceStart_Inside = len ( verts )
Deg_Step = 360.0 / float ( 6 )
for i in range ( ( 6 / 2 ) + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * Flat_Radius
y = cos ( radians ( i * Deg_Step ) ) * Flat_Radius
verts . append ( [ x , y , 0 - Outter_Radius_Height ] )
faces . extend ( Allen_Fill ( FaceStart_Outside , 0 ) )
FaceStart_Bottom = len ( verts )
Deg_Step = 360.0 / float ( 6 )
for i in range ( ( 6 / 2 ) + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * Flat_Radius
y = cos ( radians ( i * Deg_Step ) ) * Flat_Radius
verts . append ( [ x , y , 0 - HEIGHT ] )
faces . extend ( Build_Face_List_Quads ( FaceStart_Inside , 3 , 1 , TRUE ) )
faces . extend ( Fill_Ring_Face ( FaceStart_Bottom , 4 ) )
M_Verts , M_Faces = Mirror_Verts_Faces ( verts , faces , ' y ' )
verts . extend ( M_Verts )
faces . extend ( M_Faces )
2009-05-22 12:31:27 +00:00
return verts , faces , OUTTER_RADIUS * 2.0
2009-05-11 05:10:09 +00:00
##########################################################################################
##########################################################################################
## Create Phillips Bit
##########################################################################################
##########################################################################################
def Phillips_Fill ( OFFSET , FLIP = 0 ) :
faces = [ ]
Lookup = [ [ 0 , 1 , 10 ] ,
[ 1 , 11 , 10 ] ,
[ 1 , 2 , 11 ] ,
[ 2 , 12 , 11 ] ,
[ 2 , 3 , 12 ] ,
[ 3 , 4 , 12 ] ,
[ 4 , 5 , 12 ] ,
[ 5 , 6 , 12 ] ,
[ 6 , 7 , 12 ] ,
[ 7 , 13 , 12 ] ,
[ 7 , 8 , 13 ] ,
[ 8 , 14 , 13 ] ,
[ 8 , 9 , 14 ] ,
[ 10 , 11 , 16 , 15 ] ,
[ 11 , 12 , 16 ] ,
[ 12 , 13 , 16 ] ,
[ 13 , 14 , 17 , 16 ] ,
[ 15 , 16 , 17 , 18 ]
]
for i in Lookup :
if FLIP :
if len ( i ) == 3 :
faces . append ( [ OFFSET + i [ 2 ] , OFFSET + i [ 1 ] , OFFSET + i [ 0 ] ] )
else :
faces . append ( [ OFFSET + i [ 3 ] , OFFSET + i [ 2 ] , OFFSET + i [ 1 ] , OFFSET + i [ 0 ] ] )
else :
if len ( i ) == 3 :
faces . append ( [ OFFSET + i [ 0 ] , OFFSET + i [ 1 ] , OFFSET + i [ 2 ] ] )
else :
faces . append ( [ OFFSET + i [ 0 ] , OFFSET + i [ 1 ] , OFFSET + i [ 2 ] , OFFSET + i [ 3 ] ] )
return faces
def Create_Phillips_Bit ( FLAT_DIA , FLAT_WIDTH , HEIGHT ) :
Div = 36
verts = [ ]
faces = [ ]
FLAT_RADIUS = FLAT_DIA * 0.5
OUTTER_RADIUS = FLAT_RADIUS * 1.05
Flat_Half = float ( FLAT_WIDTH ) / 2.0
FaceStart_Outside = len ( verts )
Deg_Step = 360.0 / float ( Div )
for i in range ( ( Div / 4 ) + 1 ) : # only do half and mirror later
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , 0 ] )
FaceStart_Inside = len ( verts )
verts . append ( [ 0 , FLAT_RADIUS , 0 ] ) #10
verts . append ( [ Flat_Half , FLAT_RADIUS , 0 ] ) #11
verts . append ( [ Flat_Half , Flat_Half , 0 ] ) #12
verts . append ( [ FLAT_RADIUS , Flat_Half , 0 ] ) #13
verts . append ( [ FLAT_RADIUS , 0 , 0 ] ) #14
verts . append ( [ 0 , Flat_Half , 0 - HEIGHT ] ) #15
verts . append ( [ Flat_Half , Flat_Half , 0 - HEIGHT ] ) #16
verts . append ( [ Flat_Half , 0 , 0 - HEIGHT ] ) #17
verts . append ( [ 0 , 0 , 0 - HEIGHT ] ) #18
faces . extend ( Phillips_Fill ( FaceStart_Outside , TRUE ) )
Spin_Verts , Spin_Face = SpinDup ( verts , faces , 360 , 4 , ' z ' )
return Spin_Verts , Spin_Face , OUTTER_RADIUS * 2
##########################################################################################
##########################################################################################
## Create Head Types
##########################################################################################
##########################################################################################
2009-05-22 12:31:27 +00:00
def Max_Pan_Bit_Dia ( HEAD_DIA ) :
HEAD_RADIUS = HEAD_DIA * 0.5
XRad = HEAD_RADIUS * 1.976
return ( sin ( radians ( 10 ) ) * XRad ) * 2.0
2009-05-11 05:10:09 +00:00
def Create_Pan_Head ( HOLE_DIA , HEAD_DIA , SHANK_DIA , HEIGHT , RAD1 , RAD2 , FACE_OFFSET ) :
DIV = 36
HOLE_RADIUS = HOLE_DIA * 0.5
HEAD_RADIUS = HEAD_DIA * 0.5
SHANK_RADIUS = SHANK_DIA * 0.5
2009-05-22 12:31:27 +00:00
2009-05-11 05:10:09 +00:00
verts = [ ]
faces = [ ]
Row = 0
BEVEL = HEIGHT * 0.01
#Dome_Rad = HEAD_RADIUS * (1.0/1.75)
Dome_Rad = HEAD_RADIUS * 1.12
RAD_Offset = HEAD_RADIUS * 0.96
OtherRad = HEAD_RADIUS * 0.16
OtherRad_X_Offset = HEAD_RADIUS * 0.84
OtherRad_Z_Offset = HEAD_RADIUS * 0.504
XRad = HEAD_RADIUS * 1.976
ZRad = HEAD_RADIUS * 1.768
EndRad = HEAD_RADIUS * 0.284
EndZOffset = HEAD_RADIUS * 0.432
HEIGHT = HEAD_RADIUS * 0.59
# Dome_Rad = 5.6
# RAD_Offset = 4.9
# OtherRad = 0.8
# OtherRad_X_Offset = 4.2
# OtherRad_Z_Offset = 2.52
# XRad = 9.88
# ZRad = 8.84
# EndRad = 1.42
# EndZOffset = 2.16
# HEIGHT = 2.95
FaceStart = FACE_OFFSET
z = cos ( radians ( 10 ) ) * ZRad
verts . append ( [ HOLE_RADIUS , 0.0 , ( 0.0 - ZRad ) + z ] )
Start_Height = 0 - ( ( 0.0 - ZRad ) + z )
Row + = 1
#for i in range(0,30,10): was 0 to 30 more work needed to make this look good.
for i in range ( 10 , 30 , 10 ) :
x = sin ( radians ( i ) ) * XRad
z = cos ( radians ( i ) ) * ZRad
verts . append ( [ x , 0.0 , ( 0.0 - ZRad ) + z ] )
Row + = 1
for i in range ( 20 , 140 , 10 ) :
x = sin ( radians ( i ) ) * EndRad
z = cos ( radians ( i ) ) * EndRad
if ( ( 0.0 - EndZOffset ) + z ) < ( 0.0 - HEIGHT ) :
verts . append ( [ ( HEAD_RADIUS - EndRad ) + x , 0.0 , 0.0 - HEIGHT ] )
else :
verts . append ( [ ( HEAD_RADIUS - EndRad ) + x , 0.0 , ( 0.0 - EndZOffset ) + z ] )
Row + = 1
verts . append ( [ SHANK_RADIUS , 0.0 , ( 0.0 - HEIGHT ) ] )
Row + = 1
verts . append ( [ SHANK_RADIUS , 0.0 , ( 0.0 - HEIGHT ) - Start_Height ] )
Row + = 1
sVerts , sFaces = SpinDup ( verts , faces , 360 , DIV , ' z ' )
sVerts . extend ( verts ) #add the start verts to the Spin verts to complete the loop
faces . extend ( Build_Face_List_Quads ( FaceStart , Row - 1 , DIV ) )
Global_Head_Height = HEIGHT ;
return Move_Verts_Up_Z ( sVerts , Start_Height ) , faces , HEIGHT
def Create_Dome_Head ( HOLE_DIA , HEAD_DIA , SHANK_DIA , HEIGHT , RAD1 , RAD2 , FACE_OFFSET ) :
DIV = 36
HOLE_RADIUS = HOLE_DIA * 0.5
HEAD_RADIUS = HEAD_DIA * 0.5
SHANK_RADIUS = SHANK_DIA * 0.5
verts = [ ]
faces = [ ]
Row = 0
BEVEL = HEIGHT * 0.01
#Dome_Rad = HEAD_RADIUS * (1.0/1.75)
Dome_Rad = HEAD_RADIUS * 1.12
#Head_Height = HEAD_RADIUS * 0.78
RAD_Offset = HEAD_RADIUS * 0.98
Dome_Height = HEAD_RADIUS * 0.64
OtherRad = HEAD_RADIUS * 0.16
OtherRad_X_Offset = HEAD_RADIUS * 0.84
OtherRad_Z_Offset = HEAD_RADIUS * 0.504
# Dome_Rad = 5.6
# RAD_Offset = 4.9
# Dome_Height = 3.2
# OtherRad = 0.8
# OtherRad_X_Offset = 4.2
# OtherRad_Z_Offset = 2.52
#
FaceStart = FACE_OFFSET
verts . append ( [ HOLE_RADIUS , 0.0 , 0.0 ] )
Row + = 1
for i in range ( 0 , 60 , 10 ) :
x = sin ( radians ( i ) ) * Dome_Rad
z = cos ( radians ( i ) ) * Dome_Rad
if ( ( 0.0 - RAD_Offset ) + z ) < = 0 :
verts . append ( [ x , 0.0 , ( 0.0 - RAD_Offset ) + z ] )
Row + = 1
for i in range ( 60 , 160 , 10 ) :
x = sin ( radians ( i ) ) * OtherRad
z = cos ( radians ( i ) ) * OtherRad
z = ( 0.0 - OtherRad_Z_Offset ) + z
if z < ( 0.0 - Dome_Height ) :
z = ( 0.0 - Dome_Height )
verts . append ( [ OtherRad_X_Offset + x , 0.0 , z ] )
Row + = 1
verts . append ( [ SHANK_RADIUS , 0.0 , ( 0.0 - Dome_Height ) ] )
Row + = 1
sVerts , sFaces = SpinDup ( verts , faces , 360 , DIV , ' z ' )
sVerts . extend ( verts ) #add the start verts to the Spin verts to complete the loop
faces . extend ( Build_Face_List_Quads ( FaceStart , Row - 1 , DIV ) )
return sVerts , faces , Dome_Height
def Create_Cap_Head ( HOLE_DIA , HEAD_DIA , SHANK_DIA , HEIGHT , RAD1 , RAD2 ) :
DIV = 36
HOLE_RADIUS = HOLE_DIA * 0.5
HEAD_RADIUS = HEAD_DIA * 0.5
SHANK_RADIUS = SHANK_DIA * 0.5
verts = [ ]
faces = [ ]
Row = 0
BEVEL = HEIGHT * 0.01
FaceStart = len ( verts )
verts . append ( [ HOLE_RADIUS , 0.0 , 0.0 ] )
Row + = 1
#rad
for i in range ( 0 , 100 , 10 ) :
x = sin ( radians ( i ) ) * RAD1
z = cos ( radians ( i ) ) * RAD1
verts . append ( [ ( HEAD_RADIUS - RAD1 ) + x , 0.0 , ( 0.0 - RAD1 ) + z ] )
Row + = 1
verts . append ( [ HEAD_RADIUS , 0.0 , 0.0 - HEIGHT + BEVEL ] )
Row + = 1
verts . append ( [ HEAD_RADIUS - BEVEL , 0.0 , 0.0 - HEIGHT ] )
Row + = 1
#rad2
2009-05-22 12:31:27 +00:00
2009-05-11 05:10:09 +00:00
for i in range ( 0 , 100 , 10 ) :
x = sin ( radians ( i ) ) * RAD2
z = cos ( radians ( i ) ) * RAD2
verts . append ( [ ( SHANK_RADIUS + RAD2 ) - x , 0.0 , ( 0.0 - HEIGHT - RAD2 ) + z ] )
Row + = 1
sVerts , sFaces = SpinDup ( verts , faces , 360 , DIV , ' z ' )
sVerts . extend ( verts ) #add the start verts to the Spin verts to complete the loop
faces . extend ( Build_Face_List_Quads ( FaceStart , Row - 1 , DIV ) )
return sVerts , faces , HEIGHT + RAD2
def Create_Hex_Head ( FLAT , HOLE_DIA , SHANK_DIA , HEIGHT ) :
verts = [ ]
faces = [ ]
HOLE_RADIUS = HOLE_DIA * 0.5
Half_Flat = FLAT / 2
TopBevelRadius = Half_Flat - ( Half_Flat * ( 0.05 / 8 ) )
Undercut_Height = ( Half_Flat * ( 0.05 / 8 ) )
Shank_Bevel = ( Half_Flat * ( 0.05 / 8 ) )
Flat_Height = HEIGHT - Undercut_Height - Shank_Bevel
#Undercut_Height = 5
SHANK_RADIUS = SHANK_DIA / 2
Row = 0 ;
verts . append ( [ 0.0 , 0.0 , 0.0 ] )
FaceStart = len ( verts )
#inner hole
x = sin ( radians ( 0 ) ) * HOLE_RADIUS
y = cos ( radians ( 0 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 6 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 6 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 3 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 3 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 2 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 2 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
Row + = 1
#bevel
x = sin ( radians ( 0 ) ) * TopBevelRadius
y = cos ( radians ( 0 ) ) * TopBevelRadius
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 6 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 6 ) ) * TopBevelRadius
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 3 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 3 ) ) * TopBevelRadius
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 2 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 2 ) ) * TopBevelRadius
vec4 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
Row + = 1
#Flats
x = tan ( radians ( 0 ) ) * Half_Flat
dvec = vec1 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
verts . append ( [ x , Half_Flat , - dvec . length ] )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
dvec = vec2 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
verts . append ( [ x , Half_Flat , - dvec . length ] )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
dvec = vec3 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
Lowest_Point = - dvec . length
verts . append ( [ x , Half_Flat , - dvec . length ] )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
dvec = vec4 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
Lowest_Point = - dvec . length
verts . append ( [ x , Half_Flat , - dvec . length ] )
Row + = 1
#down Bits Tri
x = tan ( radians ( 0 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
Row + = 1
#down Bits
x = tan ( radians ( 0 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Flat_Height ] )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Flat_Height ] )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Flat_Height ] )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Flat_Height ] )
Row + = 1
#under cut
x = sin ( radians ( 0 ) ) * Half_Flat
y = cos ( radians ( 0 ) ) * Half_Flat
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height ] )
x = sin ( radians ( 60 / 6 ) ) * Half_Flat
y = cos ( radians ( 60 / 6 ) ) * Half_Flat
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height ] )
x = sin ( radians ( 60 / 3 ) ) * Half_Flat
y = cos ( radians ( 60 / 3 ) ) * Half_Flat
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height ] )
x = sin ( radians ( 60 / 2 ) ) * Half_Flat
y = cos ( radians ( 60 / 2 ) ) * Half_Flat
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height ] )
Row + = 1
#under cut down bit
x = sin ( radians ( 0 ) ) * Half_Flat
y = cos ( radians ( 0 ) ) * Half_Flat
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 6 ) ) * Half_Flat
y = cos ( radians ( 60 / 6 ) ) * Half_Flat
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 3 ) ) * Half_Flat
y = cos ( radians ( 60 / 3 ) ) * Half_Flat
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 2 ) ) * Half_Flat
y = cos ( radians ( 60 / 2 ) ) * Half_Flat
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
Row + = 1
#under cut to Shank BEVEAL
x = sin ( radians ( 0 ) ) * ( SHANK_RADIUS + Shank_Bevel )
y = cos ( radians ( 0 ) ) * ( SHANK_RADIUS + Shank_Bevel )
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 6 ) ) * ( SHANK_RADIUS + Shank_Bevel )
y = cos ( radians ( 60 / 6 ) ) * ( SHANK_RADIUS + Shank_Bevel )
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 3 ) ) * ( SHANK_RADIUS + Shank_Bevel )
y = cos ( radians ( 60 / 3 ) ) * ( SHANK_RADIUS + Shank_Bevel )
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
x = sin ( radians ( 60 / 2 ) ) * ( SHANK_RADIUS + Shank_Bevel )
y = cos ( radians ( 60 / 2 ) ) * ( SHANK_RADIUS + Shank_Bevel )
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height ] )
Row + = 1
#under cut to Shank BEVEAL
x = sin ( radians ( 0 ) ) * SHANK_RADIUS
y = cos ( radians ( 0 ) ) * SHANK_RADIUS
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height - Shank_Bevel ] )
x = sin ( radians ( 60 / 6 ) ) * SHANK_RADIUS
y = cos ( radians ( 60 / 6 ) ) * SHANK_RADIUS
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height - Shank_Bevel ] )
x = sin ( radians ( 60 / 3 ) ) * SHANK_RADIUS
y = cos ( radians ( 60 / 3 ) ) * SHANK_RADIUS
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height - Shank_Bevel ] )
x = sin ( radians ( 60 / 2 ) ) * SHANK_RADIUS
y = cos ( radians ( 60 / 2 ) ) * SHANK_RADIUS
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , - Flat_Height - Undercut_Height - Shank_Bevel ] )
Row + = 1
#Global_Head_Height = 0 - (-HEIGHT-0.1)
faces . extend ( Build_Face_List_Quads ( FaceStart , 3 , Row - 1 ) )
Mirror_Verts , Mirror_Faces = Mirror_Verts_Faces ( verts , faces , ' y ' )
verts . extend ( Mirror_Verts )
faces . extend ( Mirror_Faces )
Spin_Verts , Spin_Faces = SpinDup ( verts , faces , 360 , 6 , ' z ' )
return Spin_Verts , Spin_Faces , 0 - ( - HEIGHT )
##########################################################################################
##########################################################################################
## Create Bolt
##########################################################################################
##########################################################################################
def MakeBolt ( ) :
global Phillips_Bit_Depth
global Philips_Bit_Dia
global Allen_Bit_Depth
global Allen_Bit_Flat_Distance
global Hex_Head_Height
global Hex_Head_Flat_Distance
global Cap_Head_Dia
global Cap_Head_Height
global Dome_Head_Dia
global Pan_Head_Dia
global Shank_Dia
global Shank_Length
global Thread_Length
global Major_Dia
global Minor_Dia
global Pitch
global Crest_Percent
global Root_Percent
verts = [ ]
faces = [ ]
Bit_Verts = [ ]
Bit_Faces = [ ]
Bit_Dia = 0.001
Head_Verts = [ ]
Head_Faces = [ ]
Head_Height = 0.0
2009-05-22 12:31:27 +00:00
ReSized_Allen_Bit_Flat_Distance = Allen_Bit_Flat_Distance . val # set default
2009-05-11 05:10:09 +00:00
Head_Height = Hex_Head_Height . val # will be changed by the Head Functions
2009-05-22 12:31:27 +00:00
if Bit_Type [ ' ALLEN ' ] [ 0 ] . val and Head_Type [ ' PAN ' ] [ 0 ] . val :
#need to size Allen bit if it is too big.
if Allen_Bit_Dia ( Allen_Bit_Flat_Distance . val ) > Max_Pan_Bit_Dia ( Pan_Head_Dia . val ) :
ReSized_Allen_Bit_Flat_Distance = Allen_Bit_Dia_To_Flat ( Max_Pan_Bit_Dia ( Pan_Head_Dia . val ) ) * 1.05
print " Resized Allen Bit Flat Distance to " , ReSized_Allen_Bit_Flat_Distance
2009-05-11 05:10:09 +00:00
#bit Mesh
if Bit_Type [ ' ALLEN ' ] [ 0 ] . val :
2009-05-22 12:31:27 +00:00
Bit_Verts , Bit_Faces , Bit_Dia = Create_Allen_Bit ( ReSized_Allen_Bit_Flat_Distance , Allen_Bit_Depth . val )
2009-05-11 05:10:09 +00:00
if Bit_Type [ ' PHILLIPS ' ] [ 0 ] . val :
Bit_Verts , Bit_Faces , Bit_Dia = Create_Phillips_Bit ( Philips_Bit_Dia . val , Philips_Bit_Dia . val * ( 0.5 / 1.82 ) , Phillips_Bit_Depth . val )
#Head Mesh
if Head_Type [ ' HEX ' ] [ 0 ] . val :
Head_Verts , Head_Faces , Head_Height = Create_Hex_Head ( Hex_Head_Flat_Distance . val , Bit_Dia , Shank_Dia . val , Hex_Head_Height . val )
elif Head_Type [ ' CAP ' ] [ 0 ] . val :
Head_Verts , Head_Faces , Head_Height = Create_Cap_Head ( Bit_Dia , Cap_Head_Dia . val , Shank_Dia . val , Cap_Head_Height . val , Cap_Head_Dia . val * ( 1.0 / 19.0 ) , Cap_Head_Dia . val * ( 1.0 / 19.0 ) )
elif Head_Type [ ' DOME ' ] [ 0 ] . val :
Head_Verts , Head_Faces , Head_Height = Create_Dome_Head ( Bit_Dia , Dome_Head_Dia . val , Shank_Dia . val , Hex_Head_Height . val , 1 , 1 , 0 )
elif Head_Type [ ' PAN ' ] [ 0 ] . val :
Head_Verts , Head_Faces , Head_Height = Create_Pan_Head ( Bit_Dia , Pan_Head_Dia . val , Shank_Dia . val , Hex_Head_Height . val , 1 , 1 , 0 )
Face_Start = len ( verts )
verts . extend ( Move_Verts_Up_Z ( Bit_Verts , Head_Height ) )
faces . extend ( Copy_Faces ( Bit_Faces , Face_Start ) )
Face_Start = len ( verts )
verts . extend ( Move_Verts_Up_Z ( Head_Verts , Head_Height ) )
faces . extend ( Copy_Faces ( Head_Faces , Face_Start ) )
Face_Start = len ( verts )
Thread_Verts , Thread_Faces , Thread_Height = Create_External_Thread ( Shank_Dia . val , Shank_Length . val , Minor_Dia . val , Major_Dia . val , Pitch . val , Thread_Length . val , Crest_Percent . val , Root_Percent . val )
verts . extend ( Move_Verts_Up_Z ( Thread_Verts , 00 ) )
faces . extend ( Copy_Faces ( Thread_Faces , Face_Start ) )
return Move_Verts_Up_Z ( verts , Thread_Height ) , faces
##########################################################################################
##########################################################################################
## Create Internal Thread
##########################################################################################
##########################################################################################
def Create_Internal_Thread_Start_Verts ( verts , INNER_RADIUS , OUTTER_RADIUS , PITCH , DIV , CREST_PERCENT , ROOT_PERCENT , Height_Offset ) :
Ret_Row = 0 ;
Height_Offset = Height_Offset + PITCH #Move the offset up so that the verts start at
2009-05-22 12:31:27 +00:00
#at the correct place (Height_Start)
2009-05-11 05:10:09 +00:00
Half_Pitch = float ( PITCH ) / 2
Height_Start = Height_Offset - PITCH
Height_Step = float ( PITCH ) / float ( DIV )
Deg_Step = 360.0 / float ( DIV )
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Rank = float ( OUTTER_RADIUS - INNER_RADIUS ) / float ( DIV )
for j in range ( 1 ) :
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_to_Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_to_Crest_Height
Ret_Row + = 1
return Ret_Row , Height_Offset
def Create_Internal_Thread_End_Verts ( verts , INNER_RADIUS , OUTTER_RADIUS , PITCH , DIV , CREST_PERCENT , ROOT_PERCENT , Height_Offset ) :
Ret_Row = 0 ;
Half_Pitch = float ( PITCH ) / 2
#Height_End = Height_Offset - PITCH - PITCH - PITCH- PITCH - PITCH- PITCH
Height_End = Height_Offset - PITCH
#Height_End = -2.1
Height_Step = float ( PITCH ) / float ( DIV )
Deg_Step = 360.0 / float ( DIV )
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Rank = float ( OUTTER_RADIUS - INNER_RADIUS ) / float ( DIV )
Num = 0
for j in range ( 2 ) :
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z < Height_End :
z = Height_End
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z < Height_End :
z = Height_End
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_to_Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z < Height_End :
z = Height_End
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == Num :
x = sin ( radians ( i * Deg_Step ) ) * ( INNER_RADIUS + ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( INNER_RADIUS + ( i * Rank ) )
if j > Num :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z < Height_End :
z = Height_End
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == Num :
x = sin ( radians ( i * Deg_Step ) ) * ( INNER_RADIUS + ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( INNER_RADIUS + ( i * Rank ) )
if j > Num :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_to_Crest_Height
Ret_Row + = 1
return Ret_Row , Height_End # send back Height End as this is the lowest point
def Create_Internal_Thread ( INNER_DIA , OUTTER_DIA , PITCH , HEIGHT , CREST_PERCENT , ROOT_PERCENT , INTERNAL = 1 ) :
verts = [ ]
faces = [ ]
DIV = 36
INNER_RADIUS = INNER_DIA / 2
OUTTER_RADIUS = OUTTER_DIA / 2
Half_Pitch = float ( PITCH ) / 2
Deg_Step = 360.0 / float ( DIV )
Height_Step = float ( PITCH ) / float ( DIV )
Num = int ( round ( ( HEIGHT - PITCH ) / PITCH ) ) # less one pitch for the start and end that is 1/2 pitch high
Col = 0
Row = 0
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Height_Offset = 0
FaceStart = len ( verts )
Row_Inc , Height_Offset = Create_Internal_Thread_Start_Verts ( verts , INNER_RADIUS , OUTTER_RADIUS , PITCH , DIV , CREST_PERCENT , ROOT_PERCENT , Height_Offset )
Row + = Row_Inc
for j in range ( Num ) :
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , Height_Offset - ( Height_Step * i ) ] )
Height_Offset - = Crest_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , Height_Offset - ( Height_Step * i ) ] )
Height_Offset - = Crest_to_Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
verts . append ( [ x , y , Height_Offset - ( Height_Step * i ) ] )
Height_Offset - = Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
verts . append ( [ x , y , Height_Offset - ( Height_Step * i ) ] )
Height_Offset - = Root_to_Crest_Height
Row + = 1
2009-05-22 12:31:27 +00:00
2009-05-11 05:10:09 +00:00
Row_Inc , Height_Offset = Create_Internal_Thread_End_Verts ( verts , INNER_RADIUS , OUTTER_RADIUS , PITCH , DIV , CREST_PERCENT , ROOT_PERCENT , Height_Offset )
Row + = Row_Inc
faces . extend ( Build_Face_List_Quads ( FaceStart , DIV , Row - 1 , INTERNAL ) )
return verts , faces , 0 - Height_Offset
##########################################################################################
##########################################################################################
## Create External Thread
##########################################################################################
##########################################################################################
def Thread_Start3 ( verts , INNER_RADIUS , OUTTER_RADIUS , PITCH , DIV , CREST_PERCENT , ROOT_PERCENT , Height_Offset ) :
Ret_Row = 0 ;
Half_Pitch = float ( PITCH ) / 2
Height_Start = Height_Offset - PITCH
Height_Step = float ( PITCH ) / float ( DIV )
Deg_Step = 360.0 / float ( DIV )
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
#theard start
Rank = float ( OUTTER_RADIUS - INNER_RADIUS ) / float ( DIV )
for j in range ( 4 ) :
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Height_Offset - = Crest_to_Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_Height
Ret_Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Height_Offset - = Root_to_Crest_Height
Ret_Row + = 1
return Ret_Row , Height_Offset
def Create_Shank_Verts ( START_DIA , OUTTER_DIA , LENGTH , Z_LOCATION = 0 ) :
verts = [ ]
DIV = 36
START_RADIUS = START_DIA / 2
OUTTER_RADIUS = OUTTER_DIA / 2
Opp = abs ( START_RADIUS - OUTTER_RADIUS )
Taper_Lentgh = Opp / tan ( radians ( 31 ) ) ;
if Taper_Lentgh > LENGTH :
Taper_Lentgh = 0
Stright_Length = LENGTH - Taper_Lentgh
Deg_Step = 360.0 / float ( DIV )
Row = 0
Lowest_Z_Vert = 0 ;
Height_Offset = Z_LOCATION
#ring
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * START_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * START_RADIUS
z = Height_Offset - 0
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Stright_Length
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * START_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * START_RADIUS
z = Height_Offset - 0
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Taper_Lentgh
Row + = 1
return verts , Row , Height_Offset
def Create_Thread_Start_Verts ( INNER_DIA , OUTTER_DIA , PITCH , CREST_PERCENT , ROOT_PERCENT , Z_LOCATION = 0 ) :
verts = [ ]
DIV = 36
INNER_RADIUS = INNER_DIA / 2
OUTTER_RADIUS = OUTTER_DIA / 2
Half_Pitch = float ( PITCH ) / 2
Deg_Step = 360.0 / float ( DIV )
Height_Step = float ( PITCH ) / float ( DIV )
Row = 0
Lowest_Z_Vert = 0 ;
Height_Offset = Z_LOCATION
Height_Start = Height_Offset
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Rank = float ( OUTTER_RADIUS - INNER_RADIUS ) / float ( DIV )
Height_Offset = Z_LOCATION + PITCH
Cut_off = Z_LOCATION
for j in range ( 1 ) :
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
if z > Cut_off : z = Cut_off
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
if z > Cut_off : z = Cut_off
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_to_Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
if z > Cut_off : z = Cut_off
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
if z > Cut_off : z = Cut_off
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_to_Crest_Height
Row + = 1
for j in range ( 2 ) :
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_to_Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
if z > Height_Start :
z = Height_Start
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
if j == 0 :
x = sin ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
y = cos ( radians ( i * Deg_Step ) ) * ( OUTTER_RADIUS - ( i * Rank ) )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_to_Crest_Height
Row + = 1
return verts , Row , Height_Offset
def Create_Thread_Verts ( INNER_DIA , OUTTER_DIA , PITCH , HEIGHT , CREST_PERCENT , ROOT_PERCENT , Z_LOCATION = 0 ) :
verts = [ ]
DIV = 36
INNER_RADIUS = INNER_DIA / 2
OUTTER_RADIUS = OUTTER_DIA / 2
Half_Pitch = float ( PITCH ) / 2
Deg_Step = 360.0 / float ( DIV )
Height_Step = float ( PITCH ) / float ( DIV )
NUM_OF_START_THREADS = 4.0
NUM_OF_END_THREADS = 3.0
Num = int ( ( HEIGHT - ( ( NUM_OF_START_THREADS * PITCH ) + ( NUM_OF_END_THREADS * PITCH ) ) ) / PITCH )
Row = 0
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Height_Offset = Z_LOCATION
Lowest_Z_Vert = 0 ;
FaceStart = len ( verts )
for j in range ( Num ) :
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * OUTTER_RADIUS
z = Height_Offset - ( Height_Step * i )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_to_Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
z = Height_Offset - ( Height_Step * i )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
x = sin ( radians ( i * Deg_Step ) ) * INNER_RADIUS
y = cos ( radians ( i * Deg_Step ) ) * INNER_RADIUS
z = Height_Offset - ( Height_Step * i )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_to_Crest_Height
Row + = 1
return verts , Row , Height_Offset
def Create_Thread_End_Verts ( INNER_DIA , OUTTER_DIA , PITCH , CREST_PERCENT , ROOT_PERCENT , Z_LOCATION = 0 ) :
verts = [ ]
DIV = 36
INNER_RADIUS = INNER_DIA / 2
OUTTER_RADIUS = OUTTER_DIA / 2
Half_Pitch = float ( PITCH ) / 2
Deg_Step = 360.0 / float ( DIV )
Height_Step = float ( PITCH ) / float ( DIV )
Crest_Height = float ( PITCH ) * float ( CREST_PERCENT ) / float ( 100 )
Root_Height = float ( PITCH ) * float ( ROOT_PERCENT ) / float ( 100 )
Root_to_Crest_Height = Crest_to_Root_Height = ( float ( PITCH ) - ( Crest_Height + Root_Height ) ) / 2.0
Col = 0
Row = 0
Height_Offset = Z_LOCATION
Tapper_Height_Start = Height_Offset - PITCH - PITCH
Max_Height = Tapper_Height_Start - PITCH
Lowest_Z_Vert = 0 ;
FaceStart = len ( verts )
for j in range ( 4 ) :
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
z = max ( z , Max_Height )
Tapper_Radius = OUTTER_RADIUS
if z < Tapper_Height_Start :
Tapper_Radius = OUTTER_RADIUS - ( Tapper_Height_Start - z )
x = sin ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
y = cos ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
z = max ( z , Max_Height )
Tapper_Radius = OUTTER_RADIUS
if z < Tapper_Height_Start :
Tapper_Radius = OUTTER_RADIUS - ( Tapper_Height_Start - z )
x = sin ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
y = cos ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Crest_to_Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
z = max ( z , Max_Height )
Tapper_Radius = OUTTER_RADIUS - ( Tapper_Height_Start - z )
if Tapper_Radius > INNER_RADIUS :
Tapper_Radius = INNER_RADIUS
x = sin ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
y = cos ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_Height
Row + = 1
for i in range ( DIV + 1 ) :
z = Height_Offset - ( Height_Step * i )
z = max ( z , Max_Height )
Tapper_Radius = OUTTER_RADIUS - ( Tapper_Height_Start - z )
if Tapper_Radius > INNER_RADIUS :
Tapper_Radius = INNER_RADIUS
x = sin ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
y = cos ( radians ( i * Deg_Step ) ) * ( Tapper_Radius )
verts . append ( [ x , y , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Height_Offset - = Root_to_Crest_Height
Row + = 1
return verts , Row , Height_Offset , Lowest_Z_Vert
def Create_External_Thread ( SHANK_DIA , SHANK_LENGTH , INNER_DIA , OUTTER_DIA , PITCH , LENGTH , CREST_PERCENT , ROOT_PERCENT ) :
verts = [ ]
faces = [ ]
DIV = 36
Total_Row = 0
Thread_Len = 0 ;
Face_Start = len ( verts )
Offset = 0.0 ;
Shank_Verts , Shank_Row , Offset = Create_Shank_Verts ( SHANK_DIA , OUTTER_DIA , SHANK_LENGTH , Offset )
Total_Row + = Shank_Row
Thread_Start_Verts , Thread_Start_Row , Offset = Create_Thread_Start_Verts ( INNER_DIA , OUTTER_DIA , PITCH , CREST_PERCENT , ROOT_PERCENT , Offset )
Total_Row + = Thread_Start_Row
Thread_Verts , Thread_Row , Offset = Create_Thread_Verts ( INNER_DIA , OUTTER_DIA , PITCH , LENGTH , CREST_PERCENT , ROOT_PERCENT , Offset )
Total_Row + = Thread_Row
Thread_End_Verts , Thread_End_Row , Offset , Lowest_Z_Vert = Create_Thread_End_Verts ( INNER_DIA , OUTTER_DIA , PITCH , CREST_PERCENT , ROOT_PERCENT , Offset )
Total_Row + = Thread_End_Row
verts . extend ( Shank_Verts )
verts . extend ( Thread_Start_Verts )
verts . extend ( Thread_Verts )
verts . extend ( Thread_End_Verts )
faces . extend ( Build_Face_List_Quads ( Face_Start , DIV , Total_Row - 1 , 0 ) )
faces . extend ( Fill_Ring_Face ( len ( verts ) - DIV , DIV , 1 ) )
return verts , faces , 0.0 - Lowest_Z_Vert
##########################################################################################
##########################################################################################
## Create Nut
##########################################################################################
##########################################################################################
def add_Hex_Nut ( FLAT , HOLE_DIA , HEIGHT ) :
global Global_Head_Height
global Global_NutRad
verts = [ ]
faces = [ ]
HOLE_RADIUS = HOLE_DIA * 0.5
Half_Flat = FLAT / 2
Half_Height = HEIGHT / 2
TopBevelRadius = Half_Flat - 0.05
Global_NutRad = TopBevelRadius
Row = 0 ;
Lowest_Z_Vert = 0.0 ;
verts . append ( [ 0.0 , 0.0 , 0.0 ] )
FaceStart = len ( verts )
#inner hole
x = sin ( radians ( 0 ) ) * HOLE_RADIUS
y = cos ( radians ( 0 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 6 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 6 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 3 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 3 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 2 ) ) * HOLE_RADIUS
y = cos ( radians ( 60 / 2 ) ) * HOLE_RADIUS
verts . append ( [ x , y , 0.0 ] )
Row + = 1
#bevel
x = sin ( radians ( 0 ) ) * TopBevelRadius
y = cos ( radians ( 0 ) ) * TopBevelRadius
vec1 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 6 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 6 ) ) * TopBevelRadius
vec2 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 3 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 3 ) ) * TopBevelRadius
vec3 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
x = sin ( radians ( 60 / 2 ) ) * TopBevelRadius
y = cos ( radians ( 60 / 2 ) ) * TopBevelRadius
vec4 = Mathutils . Vector ( [ x , y , 0.0 ] )
verts . append ( [ x , y , 0.0 ] )
Row + = 1
#Flats
x = tan ( radians ( 0 ) ) * Half_Flat
dvec = vec1 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
verts . append ( [ x , Half_Flat , - dvec . length ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , - dvec . length )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
dvec = vec2 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
verts . append ( [ x , Half_Flat , - dvec . length ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , - dvec . length )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
dvec = vec3 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
Lowest_Point = - dvec . length
verts . append ( [ x , Half_Flat , - dvec . length ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , - dvec . length )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
dvec = vec4 - Mathutils . Vector ( [ x , Half_Flat , 0.0 ] )
Lowest_Point = - dvec . length
verts . append ( [ x , Half_Flat , - dvec . length ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , - dvec . length )
Row + = 1
#down Bits Tri
x = tan ( radians ( 0 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , Lowest_Point ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , Lowest_Point )
Row + = 1
#down Bits
x = tan ( radians ( 0 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Half_Height ] )
x = tan ( radians ( 60 / 6 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Half_Height ] )
x = tan ( radians ( 60 / 3 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Half_Height ] )
x = tan ( radians ( 60 / 2 ) ) * Half_Flat
verts . append ( [ x , Half_Flat , - Half_Height ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , - Half_Height )
Row + = 1
faces . extend ( Build_Face_List_Quads ( FaceStart , 3 , Row - 1 ) )
Global_Head_Height = HEIGHT
Tvert , tface = Mirror_Verts_Faces ( verts , faces , ' z ' , Lowest_Z_Vert )
verts . extend ( Tvert )
faces . extend ( tface )
Tvert , tface = Mirror_Verts_Faces ( verts , faces , ' y ' )
verts . extend ( Tvert )
faces . extend ( tface )
S_verts , S_faces = SpinDup ( verts , faces , 360 , 6 , ' z ' )
return S_verts , S_faces , TopBevelRadius
def add_Nylon_Head ( OUTSIDE_RADIUS , Z_LOCATION = 0 ) :
DIV = 36
verts = [ ]
faces = [ ]
Row = 0
2009-05-22 12:31:27 +00:00
INNER_HOLE = OUTSIDE_RADIUS - ( OUTSIDE_RADIUS * ( 1.25 / 4.75 ) )
2009-05-11 05:10:09 +00:00
EDGE_THICKNESS = ( OUTSIDE_RADIUS * ( 0.4 / 4.75 ) )
RAD1 = ( OUTSIDE_RADIUS * ( 0.5 / 4.75 ) )
OVER_ALL_HEIGTH = ( OUTSIDE_RADIUS * ( 2.0 / 4.75 ) )
2009-05-22 12:31:27 +00:00
2009-05-11 05:10:09 +00:00
FaceStart = len ( verts )
Start_Height = 0 - 3
Height_Offset = Z_LOCATION
Lowest_Z_Vert = 0
x = INNER_HOLE
z = ( Height_Offset - OVER_ALL_HEIGTH ) + EDGE_THICKNESS
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
x = INNER_HOLE
z = ( Height_Offset - OVER_ALL_HEIGTH )
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
for i in range ( 180 , 80 , - 10 ) :
x = sin ( radians ( i ) ) * RAD1
z = cos ( radians ( i ) ) * RAD1
verts . append ( [ ( OUTSIDE_RADIUS - RAD1 ) + x , 0.0 , ( ( Height_Offset - OVER_ALL_HEIGTH ) + RAD1 ) + z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
x = OUTSIDE_RADIUS - 0
z = Height_Offset
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
sVerts , sFaces = SpinDup ( verts , faces , 360 , DIV , ' z ' )
sVerts . extend ( verts ) #add the start verts to the Spin verts to complete the loop
2009-06-11 10:46:13 +00:00
faces . extend ( Build_Face_List_Quads ( FaceStart , Row - 1 , DIV , 1 ) )
2009-05-11 05:10:09 +00:00
return Move_Verts_Up_Z ( sVerts , 0 ) , faces , Lowest_Z_Vert
def add_Nylon_Part ( OUTSIDE_RADIUS , Z_LOCATION = 0 ) :
DIV = 36
verts = [ ]
faces = [ ]
Row = 0
INNER_HOLE = OUTSIDE_RADIUS - ( OUTSIDE_RADIUS * ( 1.5 / 4.75 ) )
EDGE_THICKNESS = ( OUTSIDE_RADIUS * ( 0.4 / 4.75 ) )
RAD1 = ( OUTSIDE_RADIUS * ( 0.5 / 4.75 ) )
OVER_ALL_HEIGTH = ( OUTSIDE_RADIUS * ( 2.0 / 4.75 ) )
PART_THICKNESS = OVER_ALL_HEIGTH - EDGE_THICKNESS
PART_INNER_HOLE = ( OUTSIDE_RADIUS * ( 2.5 / 4.75 ) )
FaceStart = len ( verts )
Start_Height = 0 - 3
Height_Offset = Z_LOCATION
Lowest_Z_Vert = 0
x = INNER_HOLE + EDGE_THICKNESS
z = Height_Offset
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
x = PART_INNER_HOLE
z = Height_Offset
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
x = PART_INNER_HOLE
z = Height_Offset - PART_THICKNESS
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
x = INNER_HOLE + EDGE_THICKNESS
z = Height_Offset - PART_THICKNESS
verts . append ( [ x , 0.0 , z ] )
Lowest_Z_Vert = min ( Lowest_Z_Vert , z )
Row + = 1
sVerts , sFaces = SpinDup ( verts , faces , 360 , DIV , ' z ' )
sVerts . extend ( verts ) #add the start verts to the Spin verts to complete the loop
2009-06-11 10:46:13 +00:00
faces . extend ( Build_Face_List_Quads ( FaceStart , Row - 1 , DIV , 1 ) )
2009-05-11 05:10:09 +00:00
return sVerts , faces , 0 - Lowest_Z_Vert
def Nut_Mesh ( ) :
verts = [ ]
faces = [ ]
Head_Verts = [ ]
Head_Faces = [ ]
Face_Start = len ( verts )
Thread_Verts , Thread_Faces , New_Nut_Height = Create_Internal_Thread ( Minor_Dia . val , Major_Dia . val , Pitch . val , Hex_Nut_Height . val , Crest_Percent . val , Root_Percent . val , 1 )
verts . extend ( Thread_Verts )
faces . extend ( Copy_Faces ( Thread_Faces , Face_Start ) )
Face_Start = len ( verts )
Head_Verts , Head_Faces , Lock_Nut_Rad = add_Hex_Nut ( Hex_Nut_Flat_Distance . val , Major_Dia . val , New_Nut_Height )
verts . extend ( ( Head_Verts ) )
faces . extend ( Copy_Faces ( Head_Faces , Face_Start ) )
LowZ = 0 - New_Nut_Height
if Nut_Type [ ' LOCK ' ] [ 0 ] . val :
Face_Start = len ( verts )
Nylon_Head_Verts , Nylon_Head_faces , LowZ = add_Nylon_Head ( Lock_Nut_Rad , 0 - New_Nut_Height )
verts . extend ( ( Nylon_Head_Verts ) )
faces . extend ( Copy_Faces ( Nylon_Head_faces , Face_Start ) )
Face_Start = len ( verts )
Nylon_Verts , Nylon_faces , Temp_LowZ = add_Nylon_Part ( Lock_Nut_Rad , 0 - New_Nut_Height )
verts . extend ( ( Nylon_Verts ) )
faces . extend ( Copy_Faces ( Nylon_faces , Face_Start ) )
return Move_Verts_Up_Z ( verts , 0 - LowZ ) , faces
2009-05-22 12:31:27 +00:00
##################################################################################################
2009-05-11 05:10:09 +00:00
def Create_Nut ( ) :
2009-05-22 12:31:27 +00:00
2009-05-11 05:10:09 +00:00
verts = [ ]
faces = [ ]
if Error_Check ( ) :
return
verts , faces = Nut_Mesh ( )
2009-05-22 12:31:27 +00:00
Add_Mesh_To_Scene ( ' Nut ' , verts , faces )
##################################################################################################
def Create_Bolt ( ) :
verts = [ ]
faces = [ ]
if Error_Check ( ) :
return
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
verts , faces = MakeBolt ( )
Add_Mesh_To_Scene ( ' Bolt ' , verts , faces )
def Remove_Doubles_From_Mesh ( verts , faces ) :
Ret_verts = [ ]
Ret_faces = [ ]
2009-05-11 05:10:09 +00:00
is_editmode = Window . EditMode ( ) # Store edit mode state
if is_editmode : Window . EditMode ( 0 ) # Python must get a mesh in object mode.
2009-05-22 12:31:27 +00:00
Temp_mesh = Mesh . New ( ' MeshTemp ' ) # create a new mesh
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Temp_mesh . verts . extend ( verts ) # add vertices to mesh
Temp_mesh . faces . extend ( faces ) # add faces to the mesh (also adds edges)
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
scn = Scene . GetCurrent ( ) # link object to current scene
Temp_Object = scn . objects . new ( Temp_mesh , ' ObjectTemp ' )
Temp_mesh . remDoubles ( 0.010 )
Temp_mesh . transform ( Mathutils . Matrix ( [ Global_Scale , 0 , 0 , 0 ] , [ 0 , Global_Scale , 0 , 0 ] , [ 0 , 0 , Global_Scale , 0 ] , [ 0 , 0 , 0 , Global_Scale ] ) )
Ret_verts [ : ] = [ v . co for v in Temp_mesh . verts ]
Ret_faces [ : ] = [ [ v . index for v in f ] for f in Temp_mesh . faces ]
#delete temp mesh
scn . objects . unlink ( Temp_Object )
scn . update ( 0 )
2009-05-11 05:10:09 +00:00
if is_editmode : Window . EditMode ( 1 )
2009-05-22 12:31:27 +00:00
return Ret_verts , Ret_faces
def Add_Mesh_To_Scene ( name , verts , faces ) :
scn = Scene . GetCurrent ( )
if scn . lib : return
ob_act = scn . objects . active
is_editmode = Window . EditMode ( )
cursor = Window . GetCursorPos ( )
quat = None
if is_editmode or Blender . Get ( ' add_view_align ' ) : # Aligning seems odd for editmode, but blender does it, oh well
try : quat = Blender . Mathutils . Quaternion ( Window . GetViewQuat ( ) )
except : pass
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
# Exist editmode for non mesh types
if ob_act and ob_act . type != ' Mesh ' and is_editmode :
EditMode ( 0 )
# We are in mesh editmode
if Window . EditMode ( ) :
me = ob_act . getData ( mesh = 1 )
if me . multires :
error_txt = ' Error % t|Unable to complete action with multires enabled '
Blender . Draw . PupMenu ( error_txt )
print error_txt
return
#Don't want to remove doubles and scale the existing
# mesh so we need to get the verts and the faces from
# a mesh that has been scaled.
verts , faces = Remove_Doubles_From_Mesh ( verts , faces )
# Add to existing mesh
# must exit editmode to modify mesh
Window . EditMode ( 0 )
me . sel = False
vert_offset = len ( me . verts )
face_offset = len ( me . faces )
# transform the verts
txmat = Blender . Mathutils . TranslationMatrix ( Blender . Mathutils . Vector ( cursor ) )
if quat :
mat = quat . toMatrix ( )
mat . invert ( )
mat . resize4x4 ( )
txmat = mat * txmat
txmat = txmat * ob_act . matrixWorld . copy ( ) . invert ( )
me . verts . extend ( verts )
# Transform the verts by the cursor and view rotation
me . transform ( txmat , selected_only = True )
if vert_offset :
me . faces . extend ( [ [ i + vert_offset for i in f ] for f in faces ] )
else :
# Mesh with no data, unlikely
me . faces . extend ( faces )
else :
# Object mode add new
me = Mesh . New ( name )
me . verts . extend ( verts )
me . faces . extend ( faces )
me . sel = True
# Object creation and location
scn . objects . selected = [ ]
ob_act = scn . objects . new ( me , name )
me . remDoubles ( 0.010 )
me . transform ( Mathutils . Matrix ( [ Global_Scale , 0 , 0 , 0 ] , [ 0 , Global_Scale , 0 , 0 ] , [ 0 , 0 , Global_Scale , 0 ] , [ 0 , 0 , 0 , Global_Scale ] ) )
scn . objects . active = ob_act
if quat :
mat = quat . toMatrix ( )
mat . invert ( )
mat . resize4x4 ( )
ob_act . setMatrix ( mat )
ob_act . loc = cursor
me . calcNormals ( )
if is_editmode or Blender . Get ( ' add_editmode ' ) :
Window . EditMode ( 1 )
Blender . Redraw ( - 1 ) #Redraw all
2009-05-11 05:10:09 +00:00
##################################################################################################
def Load_Preset ( ) :
global Preset_Menu
global Shank_Dia
global Shank_Length
global Thread_Length
global Major_Dia
global Minor_Dia
global Pitch
global Crest_Percent
global Root_Percent
global Allen_Bit_Flat_Distance
global Allen_Bit_Depth
global Head_Height
global Hex_Head_Flat_Distance
global Head_Dia
global Dome_Head_Dia
global Pan_Head_Dia
global Philips_Bit_Dia
global Phillips_Bit_Depth
global Cap_Head_Height
global Hex_Nut_Height
global Hex_Nut_Flat_Distance
if Preset_Menu . val == 1 : #M3
Shank_Dia . val = 3.0
#Pitch.val = 0.5 #Coarse
Pitch . val = 0.35 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 3.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 5.5
Hex_Head_Height . val = 2.0
Cap_Head_Dia . val = 5.5
Cap_Head_Height . val = 3.0
Allen_Bit_Flat_Distance . val = 2.5
Allen_Bit_Depth . val = 1.5
Pan_Head_Dia . val = 5.6
Dome_Head_Dia . val = 5.6
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 2.4
Hex_Nut_Flat_Distance . val = 5.5
Thread_Length . val = 6
Shank_Length . val = 0.0
if Preset_Menu . val == 2 : #M4
Shank_Dia . val = 4.0
#Pitch.val = 0.7 #Coarse
Pitch . val = 0.5 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 4.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 7.0
Hex_Head_Height . val = 2.8
Cap_Head_Dia . val = 7.0
Cap_Head_Height . val = 4.0
Allen_Bit_Flat_Distance . val = 3.0
Allen_Bit_Depth . val = 2.0
Pan_Head_Dia . val = 8.0
Dome_Head_Dia . val = 8.0
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 3.2
Hex_Nut_Flat_Distance . val = 7.0
Thread_Length . val = 8
Shank_Length . val = 0.0
if Preset_Menu . val == 3 : #M5
Shank_Dia . val = 5.0
#Pitch.val = 0.8 #Coarse
Pitch . val = 0.5 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 5.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 8.0
Hex_Head_Height . val = 3.5
Cap_Head_Dia . val = 8.5
Cap_Head_Height . val = 5.0
Allen_Bit_Flat_Distance . val = 4.0
Allen_Bit_Depth . val = 2.5
Pan_Head_Dia . val = 9.5
Dome_Head_Dia . val = 9.5
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 4.0
Hex_Nut_Flat_Distance . val = 8.0
Thread_Length . val = 10
Shank_Length . val = 0.0
if Preset_Menu . val == 4 : #M6
Shank_Dia . val = 6.0
#Pitch.val = 1.0 #Coarse
Pitch . val = 0.75 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 6.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 10.0
Hex_Head_Height . val = 4.0
Cap_Head_Dia . val = 10.0
Cap_Head_Height . val = 6.0
Allen_Bit_Flat_Distance . val = 5.0
Allen_Bit_Depth . val = 3.0
Pan_Head_Dia . val = 12.0
Dome_Head_Dia . val = 12.0
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 5.0
Hex_Nut_Flat_Distance . val = 10.0
Thread_Length . val = 12
Shank_Length . val = 0.0
if Preset_Menu . val == 5 : #M8
Shank_Dia . val = 8.0
#Pitch.val = 1.25 #Coarse
Pitch . val = 1.00 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 8.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 13.0
Hex_Head_Height . val = 5.3
Cap_Head_Dia . val = 13.5
Cap_Head_Height . val = 8.0
Allen_Bit_Flat_Distance . val = 6.0
Allen_Bit_Depth . val = 4.0
Pan_Head_Dia . val = 16.0
Dome_Head_Dia . val = 16.0
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 6.5
Hex_Nut_Flat_Distance . val = 13.0
Thread_Length . val = 16
Shank_Length . val = 0.0
if Preset_Menu . val == 6 : #M10
Shank_Dia . val = 10.0
#Pitch.val = 1.5 #Coarse
Pitch . val = 1.25 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 10.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 17.0
Hex_Head_Height . val = 6.4
Cap_Head_Dia . val = 16.0
Cap_Head_Height . val = 10.0
Allen_Bit_Flat_Distance . val = 8.0
Allen_Bit_Depth . val = 5.0
Pan_Head_Dia . val = 20.0
Dome_Head_Dia . val = 20.0
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 8.0
Hex_Nut_Flat_Distance . val = 17.0
Thread_Length . val = 20
Shank_Length . val = 0.0
if Preset_Menu . val == 7 : #M12
#Pitch.val = 1.75 #Coarse
Pitch . val = 1.50 #Fine
2009-05-22 12:31:27 +00:00
Crest_Percent . val = 10
Root_Percent . val = 10
2009-05-11 05:10:09 +00:00
Major_Dia . val = 12.0
Minor_Dia . val = Major_Dia . val - ( 1.082532 * Pitch . val )
Hex_Head_Flat_Distance . val = 19.0
Hex_Head_Height . val = 7.5
Cap_Head_Dia . val = 18.5
Cap_Head_Height . val = 12.0
Allen_Bit_Flat_Distance . val = 10.0
Allen_Bit_Depth . val = 6.0
Pan_Head_Dia . val = 24.0
Dome_Head_Dia . val = 24.0
Philips_Bit_Dia . val = Pan_Head_Dia . val * ( 1.82 / 5.6 )
Phillips_Bit_Depth . val = Get_Phillips_Bit_Height ( Philips_Bit_Dia . val )
Hex_Nut_Height . val = 10.0
Hex_Nut_Flat_Distance . val = 19.0
Shank_Dia . val = 12.0
Shank_Length . val = 33.0
Thread_Length . val = 32.0
2009-05-22 12:31:27 +00:00
##############################################################################################
2009-05-11 05:10:09 +00:00
def Test ( ) :
2009-05-22 12:31:27 +00:00
verts = [ ]
faces = [ ]
if Error_Check ( ) :
2009-05-11 05:10:09 +00:00
return
2009-05-22 12:31:27 +00:00
verts , faces = MakeBolt ( )
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Add_Mesh_To_Scene ( " TestBolt " , verts , faces )
Window . Redraw ( - 1 )
2009-05-11 05:10:09 +00:00
def event ( evt , val ) : # the function to handle input events
if evt == Draw . ESCKEY :
Draw . Exit ( ) # exit when user presses ESC
return
def button_event ( evt ) : # the function to handle Draw Button events
if evt == On_Exit_Click :
Draw . Exit ( ) # exit when user presses ESC
return
if evt == On_Test_Click :
Test ( )
Draw . Redraw ( 1 )
if evt == On_Preset_Click :
Load_Preset ( )
Draw . Redraw ( 1 )
if evt == On_Create_Click :
if Model_Type [ ' BOLT ' ] [ 0 ] . val :
Create_Bolt ( )
if Model_Type [ ' NUT ' ] [ 0 ] . val :
Create_Nut ( )
Draw . Redraw ( 1 )
elif ( evt in [ On_Hex_Click , On_Cap_Click , On_Dome_Click , On_Pan_Click ] ) :
for k in Head_Type . iterkeys ( ) :
if Head_Type [ k ] [ 1 ] != evt :
Head_Type [ k ] [ 0 ] . val = 0
else :
Head_Type [ k ] [ 0 ] . val = 1
Draw . Redraw ( 1 )
elif ( evt in [ On_Bit_None_Click , On_Bit_Allen_Click , On_Bit_Philips_Click ] ) :
for k in Bit_Type . iterkeys ( ) :
if Bit_Type [ k ] [ 1 ] != evt :
Bit_Type [ k ] [ 0 ] . val = 0
else :
Bit_Type [ k ] [ 0 ] . val = 1
Draw . Redraw ( 1 )
elif ( evt in [ On_Model_Bolt_Click , On_Model_Nut_Click ] ) :
for k in Model_Type . iterkeys ( ) :
if Model_Type [ k ] [ 1 ] != evt :
Model_Type [ k ] [ 0 ] . val = 0
else :
Model_Type [ k ] [ 0 ] . val = 1
Draw . Redraw ( 1 )
elif ( evt in [ On_Hex_Nut_Click , On_Lock_Nut_Click ] ) :
for k in Nut_Type . iterkeys ( ) :
if Nut_Type [ k ] [ 1 ] != evt :
Nut_Type [ k ] [ 0 ] . val = 0
else :
Nut_Type [ k ] [ 0 ] . val = 1
Draw . Redraw ( 1 )
#####################################################################################
def Draw_Border ( X1 , Y1 , X2 , Y2 ) : # X1,Y1 = Top Left X2,Y2 = Bottom Right
INDENT = 3
BGL . glColor3f ( 1.0 , 1.0 , 1.0 )
BGL . glBegin ( BGL . GL_LINES )
BGL . glVertex2i ( X1 + INDENT , Y1 - INDENT ) #top line
BGL . glVertex2i ( X2 - INDENT , Y1 - INDENT )
BGL . glVertex2i ( X1 + INDENT , Y1 - INDENT ) #left line
BGL . glVertex2i ( X1 + INDENT , Y2 + INDENT )
BGL . glEnd ( )
BGL . glColor3f ( 0.5 , 0.5 , 0.5 )
BGL . glBegin ( BGL . GL_LINES )
BGL . glVertex2i ( X2 - INDENT , Y1 - INDENT ) #Right line
BGL . glVertex2i ( X2 - INDENT , Y2 + INDENT )
BGL . glVertex2i ( X1 + INDENT , Y2 + INDENT ) #bottom line
BGL . glVertex2i ( X2 - INDENT , Y2 + INDENT )
BGL . glEnd ( )
def Create_Tab ( X1 , Y1 , X2 , Y2 , Title , Buttons ) : # X1,Y1 = Top Left X2,Y2 = Bottom Right
BIT_BUTTON_WIDTH = 55
BIT_BUTTON_HEIGHT = 18
TITLE_HEIGHT = 15
INDENT = 6
BUTTON_GAP = 4
BGL . glColor3f ( 0.75 , 0.75 , 0.75 )
BGL . glRecti ( X1 , Y1 , X2 , Y2 )
Draw_Border ( X1 , Y1 , X2 , Y2 ) ;
BGL . glColor3f ( 0.0 , 0.0 , 0.0 )
BGL . glRasterPos2d ( X1 + INDENT , Y1 - TITLE_HEIGHT )
Draw . Text ( Title )
Button_X = X1 + INDENT
Button_Y = Y1 - TITLE_HEIGHT - BIT_BUTTON_HEIGHT - 8
#Nut_Number_X = Nut_Button_X
#Nut_Number_Y = Nut_Button_Y - 25
if ( Buttons != 0 ) :
key = Buttons . keys ( )
for k in key :
2009-05-22 12:31:27 +00:00
Buttons [ k ] [ 0 ] = Draw . Toggle ( k , Buttons [ k ] [ 1 ] , Button_X , Button_Y , BIT_BUTTON_WIDTH , BIT_BUTTON_HEIGHT , Buttons [ k ] [ 0 ] . val , Buttons [ k ] [ 2 ] )
2009-05-11 05:10:09 +00:00
Button_X + = BIT_BUTTON_WIDTH + BUTTON_GAP
def Dispaly_Title_Bar ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
2009-06-11 10:46:13 +00:00
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Bolt Factory V2.02 " , Model_Type )
2009-05-11 05:10:09 +00:00
def Dispaly_Preset_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
BUTTON_Y_OFFSET = 40
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Preset " , 0 )
name = " M3 %x 1|M4 %x 2|M5 %x 3|M6 %x 4|M8 %x 5|M10 %x 6|M12 %x 7 "
global Preset_Menu
2009-05-22 12:31:27 +00:00
Preset_Menu = Draw . Menu ( name , No_Event , 9 , Y_POS - BUTTON_Y_OFFSET , 50 , 18 , Preset_Menu . val , " Predefined metric screw sizes. " )
Draw . Button ( " Apply " , On_Preset_Click , 150 , Y_POS - BUTTON_Y_OFFSET , 55 , 18 , " Apply the preset screw sizes. " )
2009-05-11 05:10:09 +00:00
def Dispaly_Bit_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
NUMBER_HEIGHT = 18
NUMBER_WIDTH = CONTROL_WIDTH - 3 - 3 - 3 - 3 - 3
Bit_Number_X = 3 + 3 + 3
Bit_Number_Y = Y_POS - 64
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Bit Type " , Bit_Type )
if Bit_Type [ ' NONE ' ] [ 0 ] . val :
DoNothing = 1 ;
elif Bit_Type [ ' ALLEN ' ] [ 0 ] . val :
global Allen_Bit_Depth
Allen_Bit_Depth = Draw . Number ( ' Bit Depth: ' , No_Event , Bit_Number_X , Bit_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Allen_Bit_Depth . val , 0 , 100 , ' ' )
Bit_Number_Y - = NUMBER_HEIGHT
global Allen_Bit_Flat_Distance
Allen_Bit_Flat_Distance = Draw . Number ( ' Flat Dist: ' , No_Event , Bit_Number_X , Bit_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Allen_Bit_Flat_Distance . val , 0 , 100 , ' ' )
Bit_Number_Y - = NUMBER_HEIGHT
elif Bit_Type [ ' PHILLIPS ' ] [ 0 ] . val :
global Phillips_Bit_Depth
Phillips_Bit_Depth = Draw . Number ( ' Bit Depth: ' , No_Event , Bit_Number_X , Bit_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Phillips_Bit_Depth . val , 0 , 100 , ' ' )
Bit_Number_Y - = NUMBER_HEIGHT
global Philips_Bit_Dia
Philips_Bit_Dia = Draw . Number ( ' Bit Dia: ' , No_Event , Bit_Number_X , Bit_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Philips_Bit_Dia . val , 0 , 100 , ' ' )
Bit_Number_Y - = NUMBER_HEIGHT
def Dispaly_Shank_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
NUMBER_HEIGHT = 18
NUMBER_WIDTH = CONTROL_WIDTH - 3 - 3 - 3 - 3 - 3
Number_X = 3 + 3 + 3
Number_Y_Pos = Y_POS - 40
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Shank " , 0 )
global Shank_Length
Shank_Length = Draw . Number ( ' Shank Length: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Shank_Length . val , 0 , MAX_INPUT_NUMBER , ' some text tip ' )
Number_Y_Pos - = NUMBER_HEIGHT
global Shank_Dia
Shank_Dia = Draw . Number ( ' Shank Dia: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Shank_Dia . val , 0 , MAX_INPUT_NUMBER , ' some text tip ' )
Number_Y_Pos - = NUMBER_HEIGHT
def Dispaly_Thread_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
NUMBER_HEIGHT = 18
NUMBER_WIDTH = CONTROL_WIDTH - 3 - 3 - 3 - 3 - 3
Number_X = 3 + 3 + 3
Number_Y_Pos = Y_POS - 40
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Thread " , 0 )
global Thread_Length
if Model_Type [ ' BOLT ' ] [ 0 ] . val :
Thread_Length = Draw . Number ( ' Thread Length: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Thread_Length . val , 0 , MAX_INPUT_NUMBER , ' ' )
Number_Y_Pos - = NUMBER_HEIGHT
global Major_Dia
Major_Dia = Draw . Number ( ' Major Dia: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Major_Dia . val , 0 , MAX_INPUT_NUMBER , ' ' )
Number_Y_Pos - = NUMBER_HEIGHT
global Minor_Dia
Minor_Dia = Draw . Number ( ' Minor Dia: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Minor_Dia . val , 0 , MAX_INPUT_NUMBER , ' ' )
Number_Y_Pos - = NUMBER_HEIGHT
global Pitch
2009-05-22 12:31:27 +00:00
Pitch = Draw . Number ( ' Pitch: ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Pitch . val , 0.1 , 7.0 , ' ' )
2009-05-11 05:10:09 +00:00
Number_Y_Pos - = NUMBER_HEIGHT
global Crest_Percent
Crest_Percent = Draw . Number ( ' Crest % : ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Crest_Percent . val , 1 , 90 , ' ' )
Number_Y_Pos - = NUMBER_HEIGHT
global Root_Percent
Root_Percent = Draw . Number ( ' Root % : ' , No_Event , Number_X , Number_Y_Pos , NUMBER_WIDTH , NUMBER_HEIGHT , Root_Percent . val , 1 , 90 , ' ' )
Number_Y_Pos - = NUMBER_HEIGHT
def Dispaly_Head_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
NUMBER_HEIGHT = 18
NUMBER_WIDTH = CONTROL_WIDTH - 3 - 3 - 3 - 3 - 3
Head_Number_X = 3 + 3 + 3
Head_Number_Y = Y_POS - 64
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Head Type " , Head_Type )
if Head_Type [ ' HEX ' ] [ 0 ] . val :
global Hex_Head_Height
Hex_Head_Height = Draw . Number ( ' Head Height: ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Hex_Head_Height . val , 0 , 100 , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
global Hex_Head_Flat_Distance
Hex_Head_Flat_Distance = Draw . Number ( ' Head Hex Flat Distance ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Hex_Head_Flat_Distance . val , 0 , MAX_INPUT_NUMBER , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
elif Head_Type [ ' CAP ' ] [ 0 ] . val :
global Cap_Head_Height
Cap_Head_Height = Draw . Number ( ' Head Height: ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Cap_Head_Height . val , 0 , 100 , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
global Cap_Head_Dia
Cap_Head_Dia = Draw . Number ( ' Head Dia ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Cap_Head_Dia . val , 0 , MAX_INPUT_NUMBER , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
elif Head_Type [ ' DOME ' ] [ 0 ] . val :
global Dome_Head_Dia
Dome_Head_Dia = Draw . Number ( ' Dome Head Dia ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Dome_Head_Dia . val , 0 , MAX_INPUT_NUMBER , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
elif Head_Type [ ' PAN ' ] [ 0 ] . val :
global Pan_Head_Dia
Pan_Head_Dia = Draw . Number ( ' Pan Head Dia ' , No_Event , Head_Number_X , Head_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Pan_Head_Dia . val , 0 , MAX_INPUT_NUMBER , ' ' )
Head_Number_Y - = NUMBER_HEIGHT
def Dispaly_Nut_Tab ( Y_POS , CONTROL_HEIGHT ) :
CONTROL_WIDTH = 250
NUMBER_HEIGHT = 18
NUMBER_WIDTH = CONTROL_WIDTH - 3 - 3 - 3 - 3 - 3
Nut_Number_X = 3 + 3 + 3
Nut_Number_Y = Y_POS - 64
Create_Tab ( 3 , Y_POS , CONTROL_WIDTH , Y_POS - CONTROL_HEIGHT , " Nut Type " , Nut_Type )
#if Nut_Type['HEX'][0].val:
global Hex_Nut_Height
Hex_Nut_Height = Draw . Number ( ' Nut Height: ' , No_Event , Nut_Number_X , Nut_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Hex_Nut_Height . val , 0 , MAX_INPUT_NUMBER , ' ' )
Nut_Number_Y - = NUMBER_HEIGHT
global Hex_Nut_Flat_Distance
Hex_Nut_Flat_Distance = Draw . Number ( ' Nut Flat Distance ' , No_Event , Nut_Number_X , Nut_Number_Y , NUMBER_WIDTH , NUMBER_HEIGHT , Hex_Nut_Flat_Distance . val , 0 , MAX_INPUT_NUMBER , ' ' )
Nut_Number_Y - = NUMBER_HEIGHT
def Dispaly_Bolt_Tab ( ) :
Dispaly_Shank_Tab ( 284 , 66 )
Dispaly_Head_Tab ( 374 , 90 )
Dispaly_Bit_Tab ( 464 , 90 )
##########################################################################################
def gui ( ) : # the function to draw the screen
CONTROL_WIDTH = 250
BGL . glClearColor ( 0.6 , 0.6 , 0.6 , 1.0 )
BGL . glClear ( BGL . GL_COLOR_BUFFER_BIT )
BGL . glColor3f ( 0.75 , 0.75 , 0.75 )
BGL . glRecti ( 3 , 30 , CONTROL_WIDTH , 3 )
Dispaly_Title_Bar ( 514 , 50 ) ;
if Model_Type [ ' BOLT ' ] [ 0 ] . val :
Dispaly_Bolt_Tab ( ) ;
if Model_Type [ ' NUT ' ] [ 0 ] . val :
Dispaly_Nut_Tab ( 464 , 246 ) ;
Dispaly_Thread_Tab ( 218 , 138 )
Dispaly_Preset_Tab ( 80 , 50 )
Draw . PushButton ( " Create " , On_Create_Click , 6 , 8 , 55 , 18 , " Create Bolt " )
Draw . Button ( " Exit " , On_Exit_Click , 6 + 55 + 4 , 8 , 55 , 18 )
2009-05-22 12:31:27 +00:00
# Draw.Button("Test",On_Test_Click,150,10,55,20)
2009-05-11 05:10:09 +00:00
2009-05-22 12:31:27 +00:00
Load_Preset ( )
2009-05-11 05:10:09 +00:00
Draw . Register ( gui , event , button_event ) # registering the 3 callbacks