forked from bartvdbraak/blender
2812 lines
85 KiB
Python
2812 lines
85 KiB
Python
#!BPY
|
|
# -*- coding: latin-1 -*-
|
|
"""
|
|
Name: 'Bolt Factory'
|
|
Blender: 248
|
|
Group: 'Wizards'
|
|
Tooltip: 'Create models of various types of screw fasteners.'
|
|
"""
|
|
|
|
__author__ = " Aaron Keith (Spudmn) "
|
|
__version__ = "2.02 2009/06/10"
|
|
__url__ = ["Author's site,http://sourceforge.net/projects/boltfactory/", "Blender,http://wiki.blender.org/index.php/Extensions:Py/Scripts/Manual/Misc/Bolt_Factory"]
|
|
__bpydoc__ = """\
|
|
Bolt_Factory.py
|
|
|
|
Bolt Factory is a Python script for Blender 3D.
|
|
|
|
The script allows the user to create models of various types of screw fasteners.
|
|
|
|
For best results set the material to smooth and apply a Edge Split modifier
|
|
with default settings.
|
|
|
|
|
|
History:
|
|
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
|
|
|
|
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.
|
|
|
|
|
|
"""
|
|
|
|
# --------------------------------------------------------------------------
|
|
# Bolt_Factory.py
|
|
# --------------------------------------------------------------------------
|
|
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# Copyright (C) 2009: Aaron Keith
|
|
#
|
|
# 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 *
|
|
|
|
|
|
#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
|
|
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
|
|
|
|
|
|
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,""]}
|
|
|
|
|
|
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,""]}
|
|
|
|
Model_Type={'BOLT' : [Draw.Create(1),On_Model_Bolt_Click,"Bolt Settings"],
|
|
'NUT' : [Draw.Create(0),On_Model_Nut_Click,"Nut Settings"]}
|
|
|
|
Nut_Type={'HEX' : [Draw.Create(1),On_Hex_Nut_Click,""],
|
|
'LOCK' : [Draw.Create(0),On_Lock_Nut_Click,""]}
|
|
|
|
|
|
Phillips_Bit_Depth = Draw.Create(3.27)
|
|
Philips_Bit_Dia = Draw.Create(5.20)
|
|
|
|
Allen_Bit_Depth = Draw.Create(4.0)
|
|
Allen_Bit_Flat_Distance = Draw.Create(6.0)
|
|
|
|
Hex_Head_Height = Draw.Create(5.3)
|
|
Hex_Head_Flat_Distance = Draw.Create(13.0)
|
|
|
|
Cap_Head_Dia = Draw.Create(13.5)
|
|
Cap_Head_Height = Draw.Create(8.0)
|
|
|
|
Dome_Head_Dia = Draw.Create(16.0)
|
|
|
|
Pan_Head_Dia = Draw.Create(16.0)
|
|
|
|
Shank_Dia = Draw.Create(8.0)
|
|
Shank_Length = Draw.Create(0.0)
|
|
|
|
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)
|
|
|
|
Hex_Nut_Height = Draw.Create(8.0)
|
|
Hex_Nut_Flat_Distance = Draw.Create(13.0)
|
|
|
|
Preset_Menu = Draw.Create(5)
|
|
|
|
|
|
##########################################################################################
|
|
##########################################################################################
|
|
## Miscellaneous Utilities
|
|
##########################################################################################
|
|
##########################################################################################
|
|
|
|
# Returns a list of verts rotated by the given matrix. Used by SpinDup
|
|
def Rot_Mesh(verts,matrix):
|
|
return [list(Vector(v) * matrix) for v in verts]
|
|
|
|
# Returns a list of faces that has there index incremented by offset
|
|
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
|
|
|
|
|
|
# Much like Blenders built in SpinDup.
|
|
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
|
|
|
|
for i in xrange(int(DIVISIONS)):
|
|
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
|
|
|
|
|
|
# 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]
|
|
|
|
|
|
# Returns a list of verts and faces that has been mirrored in the AXIS
|
|
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)
|
|
fsub.reverse() # flip the order to make norm point out
|
|
ret_face.append(fsub)
|
|
|
|
return ret_vert,ret_face
|
|
|
|
|
|
|
|
# Returns a list of faces that
|
|
# make up an array of 4 point polygon.
|
|
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
|
|
|
|
|
|
# Returns a list of faces that makes up a fill pattern for a
|
|
# circle
|
|
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
|
|
|
|
|
|
##########################################################################################
|
|
##########################################################################################
|
|
## Converter Functions For Bolt Factory
|
|
##########################################################################################
|
|
##########################################################################################
|
|
|
|
|
|
def Flat_To_Radius(FLAT):
|
|
h = (float(FLAT)/2)/cos(radians(30))
|
|
return h
|
|
|
|
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
|
|
|
|
##########################################################################################
|
|
##########################################################################################
|
|
## 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
|
|
global Hex_Nut_Flat_Distance
|
|
global Model_Type
|
|
#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
|
|
|
|
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"
|
|
Blender.Draw.PupMenu(error_txt)
|
|
print error_txt
|
|
Error_Result = TRUE
|
|
|
|
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
|
|
|
|
|
|
|
|
##########################################################################################
|
|
##########################################################################################
|
|
## 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
|
|
|
|
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
|
|
|
|
|
|
|
|
def Create_Allen_Bit(FLAT_DISTANCE,HEIGHT):
|
|
Div = 36
|
|
verts = []
|
|
faces = []
|
|
|
|
Flat_Radius = (float(FLAT_DISTANCE)/2.0)/cos(radians(30))
|
|
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)
|
|
|
|
return verts,faces,OUTTER_RADIUS * 2.0
|
|
|
|
|
|
##########################################################################################
|
|
##########################################################################################
|
|
## 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
|
|
##########################################################################################
|
|
##########################################################################################
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
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
|
|
|
|
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
|
|
ReSized_Allen_Bit_Flat_Distance = Allen_Bit_Flat_Distance.val # set default
|
|
|
|
|
|
Head_Height = Hex_Head_Height.val # will be changed by the Head Functions
|
|
|
|
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
|
|
|
|
#bit Mesh
|
|
if Bit_Type['ALLEN'][0].val:
|
|
Bit_Verts,Bit_Faces,Bit_Dia = Create_Allen_Bit(ReSized_Allen_Bit_Flat_Distance,Allen_Bit_Depth.val)
|
|
|
|
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
|
|
#at the correct place (Height_Start)
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
INNER_HOLE = OUTSIDE_RADIUS - (OUTSIDE_RADIUS * (1.25/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))
|
|
|
|
|
|
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
|
|
|
|
faces.extend(Build_Face_List_Quads(FaceStart,Row-1,DIV,1))
|
|
|
|
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
|
|
|
|
faces.extend(Build_Face_List_Quads(FaceStart,Row-1,DIV,1))
|
|
|
|
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
|
|
|
|
|
|
|
|
##################################################################################################
|
|
|
|
|
|
def Create_Nut():
|
|
|
|
verts = []
|
|
faces = []
|
|
|
|
|
|
if Error_Check() :
|
|
return
|
|
|
|
|
|
verts, faces = Nut_Mesh()
|
|
Add_Mesh_To_Scene('Nut', verts, faces)
|
|
|
|
|
|
##################################################################################################
|
|
|
|
|
|
def Create_Bolt():
|
|
verts = []
|
|
faces = []
|
|
|
|
|
|
if Error_Check() :
|
|
return
|
|
|
|
verts, faces = MakeBolt()
|
|
Add_Mesh_To_Scene('Bolt', verts, faces)
|
|
|
|
|
|
|
|
def Remove_Doubles_From_Mesh(verts,faces):
|
|
Ret_verts = []
|
|
Ret_faces = []
|
|
|
|
is_editmode = Window.EditMode() # Store edit mode state
|
|
if is_editmode: Window.EditMode(0) # Python must get a mesh in object mode.
|
|
|
|
Temp_mesh = Mesh.New('MeshTemp') # create a new mesh
|
|
|
|
Temp_mesh.verts.extend(verts) # add vertices to mesh
|
|
Temp_mesh.faces.extend(faces) # add faces to the mesh (also adds edges)
|
|
|
|
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)
|
|
|
|
if is_editmode: Window.EditMode(1)
|
|
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
|
|
|
|
|
|
# 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
|
|
|
|
##################################################################################################
|
|
|
|
|
|
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
Crest_Percent.val = 10
|
|
Root_Percent.val = 10
|
|
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
|
|
|
|
##############################################################################################
|
|
|
|
def Test():
|
|
verts = []
|
|
faces = []
|
|
|
|
if Error_Check() :
|
|
return
|
|
|
|
verts, faces = MakeBolt()
|
|
|
|
Add_Mesh_To_Scene("TestBolt", verts,faces)
|
|
|
|
Window.Redraw(-1)
|
|
|
|
|
|
|
|
|
|
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:
|
|
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])
|
|
Button_X += BIT_BUTTON_WIDTH + BUTTON_GAP
|
|
|
|
|
|
|
|
def Dispaly_Title_Bar(Y_POS,CONTROL_HEIGHT):
|
|
CONTROL_WIDTH = 250
|
|
Create_Tab(3,Y_POS,CONTROL_WIDTH,Y_POS -CONTROL_HEIGHT,"Bolt Factory V2.02",Model_Type)
|
|
|
|
|
|
|
|
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%x1|M4%x2|M5%x3|M6%x4|M8%x5|M10%x6|M12%x7"
|
|
|
|
global Preset_Menu
|
|
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.")
|
|
|
|
|
|
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
|
|
Pitch = Draw.Number('Pitch: ',No_Event,Number_X,Number_Y_Pos,NUMBER_WIDTH,NUMBER_HEIGHT, Pitch.val, 0.1,7.0, '')
|
|
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)
|
|
|
|
# Draw.Button("Test",On_Test_Click,150,10,55,20)
|
|
|
|
Load_Preset()
|
|
Draw.Register(gui, event, button_event) # registering the 3 callbacks
|