WIP: Fix for #6: Incorrect bolt lengths #13

Draft
sw-tya wants to merge 2 commits from sw-tya/add_mesh_BoltFactory:swtya_BoltLength into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.

View File

@ -705,6 +705,7 @@ def Create_Pan_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, FACE_OFFS
verts.append([SHANK_RADIUS, 0.0, (0.0 - HEIGHT)]) verts.append([SHANK_RADIUS, 0.0, (0.0 - HEIGHT)])
Row += 1 Row += 1
washer_face_z = Start_Height - HEIGHT
verts.append([SHANK_RADIUS, 0.0, (0.0 - HEIGHT) - Start_Height]) verts.append([SHANK_RADIUS, 0.0, (0.0 - HEIGHT) - Start_Height])
Row += 1 Row += 1
@ -716,7 +717,7 @@ def Create_Pan_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, FACE_OFFS
# Global_Head_Height = HEIGHT # UNUSED # Global_Head_Height = HEIGHT # UNUSED
return Move_Verts_Up_Z(sVerts, Start_Height), faces, HEIGHT return Move_Verts_Up_Z(sVerts, Start_Height), faces, HEIGHT, washer_face_z
def Create_Dome_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, FACE_OFFSET, DIV_COUNT): def Create_Dome_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, FACE_OFFSET, DIV_COUNT):
@ -843,6 +844,8 @@ def Create_Cap_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, DIV_COUNT
verts.append([HEAD_RADIUS - BEVEL, 0.0, 0.0 - HEIGHT]) verts.append([HEAD_RADIUS - BEVEL, 0.0, 0.0 - HEIGHT])
Row += 1 Row += 1
washer_face_z = -HEIGHT
# rad2 # rad2
for i in range(0, 100, 10): for i in range(0, 100, 10):
x = sin(radians(i)) * RAD2 x = sin(radians(i)) * RAD2
@ -855,7 +858,7 @@ def Create_Cap_Head(HOLE_DIA, HEAD_DIA, SHANK_DIA, HEIGHT, RAD1, RAD2, DIV_COUNT
faces.extend(Build_Face_List_Quads(FaceStart, Row - 1, DIV_COUNT)) faces.extend(Build_Face_List_Quads(FaceStart, Row - 1, DIV_COUNT))
return sVerts, faces, HEIGHT + RAD2 return sVerts, faces, HEIGHT + RAD2, washer_face_z
def Create_Hex_Head(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT): def Create_Hex_Head(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT):
@ -868,6 +871,7 @@ def Create_Hex_Head(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT):
Undercut_Height = (Half_Flat * (0.05 / 8)) Undercut_Height = (Half_Flat * (0.05 / 8))
Shank_Bevel = (Half_Flat * (0.05 / 8)) Shank_Bevel = (Half_Flat * (0.05 / 8))
Flat_Height = HEIGHT - Undercut_Height - Shank_Bevel Flat_Height = HEIGHT - Undercut_Height - Shank_Bevel
washer_face_z = -HEIGHT + Undercut_Height
# Undercut_Height = 5 # Undercut_Height = 5
SHANK_RADIUS = SHANK_DIA / 2 SHANK_RADIUS = SHANK_DIA / 2
Row = 0 Row = 0
@ -927,7 +931,6 @@ def Create_Hex_Head(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT):
x = tan(radians(60 / 3)) * Half_Flat x = tan(radians(60 / 3)) * Half_Flat
dvec = vec3 - Vector([x, Half_Flat, 0.0]) dvec = vec3 - Vector([x, Half_Flat, 0.0])
Lowest_Point = -dvec.length
verts.append([x, Half_Flat, -dvec.length]) verts.append([x, Half_Flat, -dvec.length])
x = tan(radians(60 / 2)) * Half_Flat x = tan(radians(60 / 2)) * Half_Flat
@ -1061,7 +1064,7 @@ def Create_Hex_Head(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT):
Spin_Verts, Spin_Faces = SpinDup(verts, faces, 360, 6, 'z') Spin_Verts, Spin_Faces = SpinDup(verts, faces, 360, 6, 'z')
return Spin_Verts, Spin_Faces, 0 - (-HEIGHT) return Spin_Verts, Spin_Faces, 0 - (-HEIGHT), washer_face_z
def Create_12_Point(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT, FLANGE_DIA): def Create_12_Point(FLAT, HOLE_DIA, SHANK_DIA, HEIGHT, FLANGE_DIA):
@ -1600,9 +1603,10 @@ def Create_Thread_Verts(INNER_DIA, OUTTER_DIA, PITCH, HEIGHT,
Deg_Step = 360.0 / float(DIV_COUNT) Deg_Step = 360.0 / float(DIV_COUNT)
Height_Step = float(PITCH) / float(DIV_COUNT) Height_Step = float(PITCH) / float(DIV_COUNT)
NUM_OF_START_THREADS = 4.0 NUM_OF_START_THREADS = 2.0 # Was 4 in the very first submission
NUM_OF_END_THREADS = 3.0 NUM_OF_END_THREADS = 3.0
Num = int((HEIGHT - ((NUM_OF_START_THREADS * PITCH) + (NUM_OF_END_THREADS * PITCH))) / PITCH) Num = int((HEIGHT - ((NUM_OF_START_THREADS * PITCH) + (NUM_OF_END_THREADS * PITCH))) / PITCH)
# This uses less than the requested bolt length by up to 1 pitch, after 5 revolutions
Row = 0 Row = 0
Crest_Height = float(PITCH) * float(CREST_PERCENT) / float(100) Crest_Height = float(PITCH) * float(CREST_PERCENT) / float(100)
@ -1774,15 +1778,20 @@ def Create_External_Thread(SHANK_DIA, SHANK_LENGTH, INNER_DIA, OUTTER_DIA,
) )
Total_Row += Thread_End_Row Total_Row += Thread_End_Row
# Make a final correction for the bolt length to mitigate rounding errors during manufacture
Mini_adder = Lowest_Z_Vert + SHANK_LENGTH + LENGTH
if Mini_adder < LENGTH * 0.01:
Mini_adder = 0 # Catches a very thin shim and also negative situations, worst case error is 1%
verts.extend(Shank_Verts) verts.extend(Shank_Verts)
verts.extend(Thread_Start_Verts) verts.extend(Move_Verts_Up_Z(Thread_Start_Verts, -Mini_adder)) # Needs moving down by the mini_adder
verts.extend(Thread_Verts) verts.extend(Move_Verts_Up_Z(Thread_Verts, -Mini_adder)) # so that any missing length is added
verts.extend(Thread_End_Verts) verts.extend(Move_Verts_Up_Z(Thread_End_Verts, -Mini_adder)) # between the thread and the shank.
faces.extend(Build_Face_List_Quads(Face_Start, DIV_COUNT, Total_Row - 1, 0)) faces.extend(Build_Face_List_Quads(Face_Start, DIV_COUNT, Total_Row - 1, 0))
faces.extend(Fill_Ring_Face(len(verts) - DIV_COUNT, DIV_COUNT, 1)) faces.extend(Fill_Ring_Face(len(verts) - DIV_COUNT, DIV_COUNT, 1))
return verts, faces, 0.0 - Lowest_Z_Vert return verts, faces, 0.0 - Lowest_Z_Vert + Mini_adder
# #################################################################### # ####################################################################
@ -2379,13 +2388,16 @@ def Bolt_Mesh(props, context):
props.bf_Philips_Bit_Dia / GLOBAL_SCALE * (0.5 / 1.82), props.bf_Philips_Bit_Dia / GLOBAL_SCALE * (0.5 / 1.82),
props.bf_Phillips_Bit_Depth / GLOBAL_SCALE props.bf_Phillips_Bit_Depth / GLOBAL_SCALE
) )
# Head Mesh # Head Mesh
# Define the washer face of the bolt, i.e. the underside. Some bolts have a bevel or radius to the shank included
# Their head height causes an incorrect shank/thread length determination.
washer_face_z = 0 # z-axis height, some Heads return a variable that overwrites this
if props.bf_Head_Type == 'bf_Head_Hex': if props.bf_Head_Type == 'bf_Head_Hex':
Head_Verts, Head_Faces, Head_Height = Create_Hex_Head( Head_Verts, Head_Faces, Head_Height, washer_face_z = Create_Hex_Head(
props.bf_Hex_Head_Flat_Distance / GLOBAL_SCALE, Bit_Dia, props.bf_Hex_Head_Flat_Distance / GLOBAL_SCALE, Bit_Dia,
props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Hex_Head_Height / GLOBAL_SCALE props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Hex_Head_Height / GLOBAL_SCALE
) )
elif props.bf_Head_Type == 'bf_Head_12Pnt': elif props.bf_Head_Type == 'bf_Head_12Pnt':
Head_Verts, Head_Faces, Head_Height = Create_12_Point_Head( Head_Verts, Head_Faces, Head_Height = Create_12_Point_Head(
props.bf_12_Point_Head_Flat_Distance / GLOBAL_SCALE, Bit_Dia, props.bf_12_Point_Head_Flat_Distance / GLOBAL_SCALE, Bit_Dia,
@ -2394,7 +2406,7 @@ def Bolt_Mesh(props, context):
max(props.bf_12_Point_Head_Flange_Dia / GLOBAL_SCALE, props.bf_12_Point_Head_Flat_Distance / GLOBAL_SCALE) max(props.bf_12_Point_Head_Flange_Dia / GLOBAL_SCALE, props.bf_12_Point_Head_Flat_Distance / GLOBAL_SCALE)
) )
elif props.bf_Head_Type == 'bf_Head_Cap': elif props.bf_Head_Type == 'bf_Head_Cap':
Head_Verts, Head_Faces, Head_Height = Create_Cap_Head( Head_Verts, Head_Faces, Head_Height, washer_face_z = Create_Cap_Head(
Bit_Dia, props.bf_Cap_Head_Dia / GLOBAL_SCALE, Bit_Dia, props.bf_Cap_Head_Dia / GLOBAL_SCALE,
props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Cap_Head_Height / GLOBAL_SCALE, props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Cap_Head_Height / GLOBAL_SCALE,
props.bf_Cap_Head_Dia / GLOBAL_SCALE * (1.0 / 19.0), props.bf_Cap_Head_Dia / GLOBAL_SCALE * (1.0 / 19.0),
@ -2407,9 +2419,8 @@ def Bolt_Mesh(props, context):
props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Hex_Head_Height / GLOBAL_SCALE, props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Hex_Head_Height / GLOBAL_SCALE,
1, 1, 0, props.bf_Div_Count 1, 1, 0, props.bf_Div_Count
) )
elif props.bf_Head_Type == 'bf_Head_Pan': elif props.bf_Head_Type == 'bf_Head_Pan':
Head_Verts, Head_Faces, Head_Height = Create_Pan_Head( Head_Verts, Head_Faces, Head_Height, washer_face_z = Create_Pan_Head(
Bit_Dia, props.bf_Pan_Head_Dia / GLOBAL_SCALE, Bit_Dia, props.bf_Pan_Head_Dia / GLOBAL_SCALE,
props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Shank_Dia / GLOBAL_SCALE,
props.bf_Hex_Head_Height / GLOBAL_SCALE, 1, 1, 0, props.bf_Hex_Head_Height / GLOBAL_SCALE, 1, 1, 0,
@ -2431,11 +2442,24 @@ def Bolt_Mesh(props, context):
verts.extend(Move_Verts_Up_Z(Head_Verts, Head_Height)) verts.extend(Move_Verts_Up_Z(Head_Verts, Head_Height))
faces.extend(Copy_Faces(Head_Faces, Face_Start)) faces.extend(Copy_Faces(Head_Faces, Face_Start))
make_shank = (props.bf_Shank_Length / GLOBAL_SCALE)
make_thread = (props.bf_Thread_Length / GLOBAL_SCALE)
if washer_face_z != 0:
# At this point the mesh is back at z=zero. The washer face may be randomly above this depending on
# the head choice. Optional returned variable is used to shorten up the shank/thread.
# If the Head function modified the washer_face-z we are here to make a length correction.
washer_face = washer_face_z + Head_Height
make_shank = (props.bf_Shank_Length / GLOBAL_SCALE) - washer_face
if make_shank < 0:
# If all the shank length is used up then take it off the thread length
make_thread = (props.bf_Thread_Length / GLOBAL_SCALE) + make_shank
make_shank = 0
Face_Start = len(verts) Face_Start = len(verts)
Thread_Verts, Thread_Faces, Thread_Height = Create_External_Thread( Thread_Verts, Thread_Faces, Thread_Height = Create_External_Thread(
props.bf_Shank_Dia / GLOBAL_SCALE, props.bf_Shank_Length / GLOBAL_SCALE, props.bf_Shank_Dia / GLOBAL_SCALE, make_shank,
props.bf_Minor_Dia / GLOBAL_SCALE, props.bf_Major_Dia / GLOBAL_SCALE, props.bf_Minor_Dia / GLOBAL_SCALE, props.bf_Major_Dia / GLOBAL_SCALE,
props.bf_Pitch / GLOBAL_SCALE, props.bf_Thread_Length / GLOBAL_SCALE, props.bf_Pitch / GLOBAL_SCALE, make_thread,
props.bf_Crest_Percent, props.bf_Crest_Percent,
props.bf_Root_Percent, props.bf_Div_Count props.bf_Root_Percent, props.bf_Div_Count
) )