1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
23 from itertools
import *
28 #Global_Scale = 0.001 #1 blender unit = X mm
29 GLOBAL_SCALE
= 0.1 #1 blender unit = X mm
30 #Global_Scale = 1.0 #1 blender unit = X mm
35 # next two utility functions are stolen from import_obj.py
37 def unpack_list(list_of_tuples
):
39 for t
in list_of_tuples
:
43 def unpack_face_list(list_of_tuples
):
45 for t
in list_of_tuples
:
48 if len(face
) != 3 and len(face
) != 4:
49 raise RuntimeError("{0} vertices in face".format(len(face
)))
51 # rotate indices if the 4th is 0
52 if len(face
) == 4 and face
[3] == 0:
53 face
= [face
[3], face
[0], face
[1], face
[2]]
63 Remove Doubles takes a list on Verts and a list of Faces and
64 removes the doubles, much like Blender does in edit mode.
65 It doesn’t have the range function but it will round the corrdinates
66 and remove verts that are very close togther. The function
67 is useful because you can perform a “Remove Doubles” with out
68 having to enter Edit Mode. Having to enter edit mode has the
69 disadvantage of not being able to interactively change the properties.
73 def RemoveDoubles(verts
,faces
,Decimal_Places
= 4):
81 Rounded_Verts
.append([round(v
[0],Decimal_Places
),round(v
[1],Decimal_Places
),round(v
[2],Decimal_Places
)])
85 for vert_index
in face
:
86 Real_co
= tuple(verts
[vert_index
])
87 Rounded_co
= tuple(Rounded_Verts
[vert_index
])
89 if Rounded_co
not in dict_verts
:
90 dict_verts
[Rounded_co
] = len(dict_verts
)
91 new_verts
.append(Real_co
)
92 if dict_verts
[Rounded_co
] not in new_face
:
93 new_face
.append(dict_verts
[Rounded_co
])
94 if len(new_face
) == 3 or len(new_face
) == 4:
95 new_faces
.append(new_face
)
97 return new_verts
,new_faces
102 def Scale_Mesh_Verts(verts
,scale_factor
):
105 Ret_verts
.append([v
[0]*scale_factor
,v
[1]*scale_factor
,v
[2]*scale_factor
])
112 #Create a matrix representing a rotation.
116 # * angle (float) - The angle of rotation desired.
117 # * matSize (int) - The size of the rotation matrix to construct. Can be 2d, 3d, or 4d.
118 # * axisFlag (string (optional)) - Possible values:
119 # o "x - x-axis rotation"
120 # o "y - y-axis rotation"
121 # o "z - z-axis rotation"
122 # o "r - arbitrary rotation around vector"
123 # * axis (Vector object. (optional)) - The arbitrary axis of rotation used with "R"
125 #Returns: Matrix object.
126 # A new rotation matrix.
127 def Simple_RotationMatrix(angle
, matSize
, axisFlag
):
129 print ("Simple_RotationMatrix can only do 4x4")
131 q
= radians(angle
) #make the rotation go clockwise
134 matrix
= mathutils
.Matrix
.Rotation(q
, 4, 'X')
135 elif axisFlag
== 'y':
136 matrix
= mathutils
.Matrix
.Rotation(q
, 4, 'Y')
137 elif axisFlag
== 'z':
138 matrix
= mathutils
.Matrix
.Rotation(q
, 4, 'Z')
140 print ("Simple_RotationMatrix can only do x y z axis")
144 ##########################################################################################
145 ##########################################################################################
146 ## Converter Functions For Bolt Factory
147 ##########################################################################################
148 ##########################################################################################
151 def Flat_To_Radius(FLAT
):
152 h
= (float(FLAT
)/2)/cos(radians(30))
155 def Get_Phillips_Bit_Height(Bit_Dia
):
156 Flat_Width_half
= (Bit_Dia
*(0.5/1.82))/2.0
157 Bit_Rad
= Bit_Dia
/ 2.0
158 x
= Bit_Rad
- Flat_Width_half
159 y
= tan(radians(60))*x
163 ##########################################################################################
164 ##########################################################################################
165 ## Miscellaneous Utilities
166 ##########################################################################################
167 ##########################################################################################
169 # Returns a list of verts rotated by the given matrix. Used by SpinDup
170 def Rot_Mesh(verts
, matrix
):
171 from mathutils
import Vector
172 return [(matrix
* Vector(v
))[:] for v
in verts
]
175 # Returns a list of faces that has there index incremented by offset
176 def Copy_Faces(faces
,offset
):
177 return [[(i
+ offset
) for i
in f
] for f
in faces
]
180 # Much like Blenders built in SpinDup.
181 def SpinDup(VERTS
,FACES
,DEGREE
,DIVISIONS
,AXIS
):
188 step
= DEGREE
/DIVISIONS
# set step so pieces * step = degrees in arc
190 for i
in range(int(DIVISIONS
)):
191 rotmat
= Simple_RotationMatrix(step
*i
, 4, AXIS
) # 4x4 rotation matrix, 30d about the x axis.
192 Rot
= Rot_Mesh(VERTS
,rotmat
)
193 faces
.extend(Copy_Faces(FACES
,len(verts
)))
199 # Returns a list of verts that have been moved up the z axis by DISTANCE
200 def Move_Verts_Up_Z(VERTS
,DISTANCE
):
203 ret
.append([v
[0],v
[1],v
[2]+DISTANCE
])
207 # Returns a list of verts and faces that has been mirrored in the AXIS
208 def Mirror_Verts_Faces(VERTS
,FACES
,AXIS
,FLIP_POINT
=0):
214 Delta
= v
[0] - FLIP_POINT
215 ret_vert
.append([FLIP_POINT
-Delta
,v
[1],v
[2]])
218 Delta
= v
[1] - FLIP_POINT
219 ret_vert
.append([v
[0],FLIP_POINT
-Delta
,v
[2]])
222 Delta
= v
[2] - FLIP_POINT
223 ret_vert
.append([v
[0],v
[1],FLIP_POINT
-Delta
])
227 for i
in range(len(f
)):
228 fsub
.append(f
[i
]+ offset
)
229 fsub
.reverse() # flip the order to make norm point out
230 ret_face
.append(fsub
)
232 return ret_vert
,ret_face
236 # Returns a list of faces that
237 # make up an array of 4 point polygon.
238 def Build_Face_List_Quads(OFFSET
,COLUM
,ROW
,FLIP
= 0):
242 for i
in range(COLUM
):
244 Res2
= RowStart
+ i
+ (COLUM
+1)
245 Res3
= RowStart
+ i
+ (COLUM
+1) +1
248 Ret
.append([OFFSET
+Res1
,OFFSET
+Res2
,OFFSET
+Res3
,OFFSET
+Res4
])
250 Ret
.append([OFFSET
+Res4
,OFFSET
+Res3
,OFFSET
+Res2
,OFFSET
+Res1
])
255 # Returns a list of faces that makes up a fill pattern for a
257 def Fill_Ring_Face(OFFSET
,NUM
,FACE_DOWN
= 0):
266 for i
in range(NUM
-2):
268 TempFace
[0] = Face
[C
];
269 TempFace
[1] = Face
[C
] + 1;
270 TempFace
[2] = Face
[B
];
272 Ret
.append([OFFSET
+Face
[2],OFFSET
+Face
[1],OFFSET
+Face
[0]])
274 Ret
.append([OFFSET
+Face
[0],OFFSET
+Face
[1],OFFSET
+Face
[2]])
276 TempFace
[0] =Face
[C
];
280 TempFace
[1] = Face
[C
] - 1;
281 TempFace
[2] = Face
[B
];
283 Ret
.append([OFFSET
+Face
[0],OFFSET
+Face
[1],OFFSET
+Face
[2]])
285 Ret
.append([OFFSET
+Face
[2],OFFSET
+Face
[1],OFFSET
+Face
[0]])
287 Face
[0] = TempFace
[0]
288 Face
[1] = TempFace
[1]
289 Face
[2] = TempFace
[2]
292 ######################################################################################
293 ##########################################################################################
294 ##########################################################################################
296 ##########################################################################################
297 ##########################################################################################
300 def Allen_Fill(OFFSET
,FLIP
= 0):
329 faces
.append([OFFSET
+i
[2],OFFSET
+i
[1],OFFSET
+i
[0]])
331 faces
.append([OFFSET
+i
[0],OFFSET
+i
[1],OFFSET
+i
[2]])
335 def Allen_Bit_Dia(FLAT_DISTANCE
):
336 Flat_Radius
= (float(FLAT_DISTANCE
)/2.0)/cos(radians(30))
337 return (Flat_Radius
* 1.05) * 2.0
339 def Allen_Bit_Dia_To_Flat(DIA
):
340 Flat_Radius
= (DIA
/2.0)/1.05
341 return (Flat_Radius
* cos (radians(30)))* 2.0
345 def Create_Allen_Bit(FLAT_DISTANCE
,HEIGHT
):
350 Flat_Radius
= (float(FLAT_DISTANCE
)/2.0)/cos(radians(30))
351 OUTTER_RADIUS
= Flat_Radius
* 1.05
352 Outter_Radius_Height
= Flat_Radius
* (0.1/5.77)
353 FaceStart_Outside
= len(verts
)
354 Deg_Step
= 360.0 /float(Div
)
356 for i
in range(int(Div
/2)+1): # only do half and mirror later
357 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
358 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
359 verts
.append([x
,y
,0])
361 FaceStart_Inside
= len(verts
)
363 Deg_Step
= 360.0 /float(6)
364 for i
in range(int(6/2)+1):
365 x
= sin(radians(i
*Deg_Step
))* Flat_Radius
366 y
= cos(radians(i
*Deg_Step
))* Flat_Radius
367 verts
.append([x
,y
,0-Outter_Radius_Height
])
369 faces
.extend(Allen_Fill(FaceStart_Outside
,0))
372 FaceStart_Bottom
= len(verts
)
374 Deg_Step
= 360.0 /float(6)
375 for i
in range(int(6/2)+1):
376 x
= sin(radians(i
*Deg_Step
))* Flat_Radius
377 y
= cos(radians(i
*Deg_Step
))* Flat_Radius
378 verts
.append([x
,y
,0-HEIGHT
])
380 faces
.extend(Build_Face_List_Quads(FaceStart_Inside
,3,1,True))
381 faces
.extend(Fill_Ring_Face(FaceStart_Bottom
,4))
384 M_Verts
,M_Faces
= Mirror_Verts_Faces(verts
,faces
,'y')
385 verts
.extend(M_Verts
)
386 faces
.extend(M_Faces
)
388 return verts
,faces
,OUTTER_RADIUS
* 2.0
391 ##########################################################################################
392 ##########################################################################################
393 ## Create Phillips Bit
394 ##########################################################################################
395 ##########################################################################################
398 def Phillips_Fill(OFFSET
,FLIP
= 0):
428 faces
.append([OFFSET
+i
[2],OFFSET
+i
[1],OFFSET
+i
[0]])
430 faces
.append([OFFSET
+i
[3],OFFSET
+i
[2],OFFSET
+i
[1],OFFSET
+i
[0]])
433 faces
.append([OFFSET
+i
[0],OFFSET
+i
[1],OFFSET
+i
[2]])
435 faces
.append([OFFSET
+i
[0],OFFSET
+i
[1],OFFSET
+i
[2],OFFSET
+i
[3]])
440 def Create_Phillips_Bit(FLAT_DIA
,FLAT_WIDTH
,HEIGHT
):
445 FLAT_RADIUS
= FLAT_DIA
* 0.5
446 OUTTER_RADIUS
= FLAT_RADIUS
* 1.05
448 Flat_Half
= float(FLAT_WIDTH
)/2.0
450 FaceStart_Outside
= len(verts
)
451 Deg_Step
= 360.0 /float(Div
)
452 for i
in range(int(Div
/4)+1): # only do half and mirror later
453 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
454 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
455 verts
.append([x
,y
,0])
458 # FaceStart_Inside = len(verts) # UNUSED
459 verts
.append([0,FLAT_RADIUS
,0]) #10
460 verts
.append([Flat_Half
,FLAT_RADIUS
,0]) #11
461 verts
.append([Flat_Half
,Flat_Half
,0]) #12
462 verts
.append([FLAT_RADIUS
,Flat_Half
,0]) #13
463 verts
.append([FLAT_RADIUS
,0,0]) #14
466 verts
.append([0,Flat_Half
,0-HEIGHT
]) #15
467 verts
.append([Flat_Half
,Flat_Half
,0-HEIGHT
]) #16
468 verts
.append([Flat_Half
,0,0-HEIGHT
]) #17
470 verts
.append([0,0,0-HEIGHT
]) #18
472 faces
.extend(Phillips_Fill(FaceStart_Outside
,True))
474 Spin_Verts
,Spin_Face
= SpinDup(verts
,faces
,360,4,'z')
476 return Spin_Verts
,Spin_Face
,OUTTER_RADIUS
* 2
479 ##########################################################################################
480 ##########################################################################################
482 ##########################################################################################
483 ##########################################################################################
485 def Max_Pan_Bit_Dia(HEAD_DIA
):
486 HEAD_RADIUS
= HEAD_DIA
* 0.5
487 XRad
= HEAD_RADIUS
* 1.976
488 return (sin(radians(10))*XRad
) * 2.0
491 def Create_Pan_Head(HOLE_DIA
,HEAD_DIA
,SHANK_DIA
,HEIGHT
,RAD1
,RAD2
,FACE_OFFSET
):
494 HOLE_RADIUS
= HOLE_DIA
* 0.5
495 HEAD_RADIUS
= HEAD_DIA
* 0.5
496 SHANK_RADIUS
= SHANK_DIA
* 0.5
502 XRad
= HEAD_RADIUS
* 1.976
503 ZRad
= HEAD_RADIUS
* 1.768
504 EndRad
= HEAD_RADIUS
* 0.284
505 EndZOffset
= HEAD_RADIUS
* 0.432
506 HEIGHT
= HEAD_RADIUS
* 0.59
511 # OtherRad_X_Offset = 4.2
512 # OtherRad_Z_Offset = 2.52
519 FaceStart
= FACE_OFFSET
521 z
= cos(radians(10))*ZRad
522 verts
.append([HOLE_RADIUS
,0.0,(0.0-ZRad
)+z
])
523 Start_Height
= 0 - ((0.0-ZRad
)+z
)
526 #for i in range(0,30,10): was 0 to 30 more work needed to make this look good.
527 for i
in range(10,30,10):
528 x
= sin(radians(i
))*XRad
529 z
= cos(radians(i
))*ZRad
530 verts
.append([x
,0.0,(0.0-ZRad
)+z
])
533 for i
in range(20,140,10):
534 x
= sin(radians(i
))*EndRad
535 z
= cos(radians(i
))*EndRad
536 if ((0.0 - EndZOffset
)+z
) < (0.0-HEIGHT
):
537 verts
.append([(HEAD_RADIUS
-EndRad
)+x
,0.0,0.0 - HEIGHT
])
539 verts
.append([(HEAD_RADIUS
-EndRad
)+x
,0.0,(0.0 - EndZOffset
)+z
])
543 verts
.append([SHANK_RADIUS
,0.0,(0.0-HEIGHT
)])
546 verts
.append([SHANK_RADIUS
,0.0,(0.0-HEIGHT
)-Start_Height
])
550 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
551 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
553 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
))
555 # Global_Head_Height = HEIGHT # UNUSED
558 return Move_Verts_Up_Z(sVerts
,Start_Height
),faces
,HEIGHT
562 def Create_Dome_Head(HOLE_DIA
,HEAD_DIA
,SHANK_DIA
,HEIGHT
,RAD1
,RAD2
,FACE_OFFSET
):
564 HOLE_RADIUS
= HOLE_DIA
* 0.5
565 HEAD_RADIUS
= HEAD_DIA
* 0.5
566 SHANK_RADIUS
= SHANK_DIA
* 0.5
571 # BEVEL = HEIGHT * 0.01 # UNUSED
572 #Dome_Rad = HEAD_RADIUS * (1.0/1.75)
574 Dome_Rad
= HEAD_RADIUS
* 1.12
575 #Head_Height = HEAD_RADIUS * 0.78
576 RAD_Offset
= HEAD_RADIUS
* 0.98
577 Dome_Height
= HEAD_RADIUS
* 0.64
578 OtherRad
= HEAD_RADIUS
* 0.16
579 OtherRad_X_Offset
= HEAD_RADIUS
* 0.84
580 OtherRad_Z_Offset
= HEAD_RADIUS
* 0.504
587 # OtherRad_X_Offset = 4.2
588 # OtherRad_Z_Offset = 2.52
591 FaceStart
= FACE_OFFSET
593 verts
.append([HOLE_RADIUS
,0.0,0.0])
597 for i
in range(0,60,10):
598 x
= sin(radians(i
))*Dome_Rad
599 z
= cos(radians(i
))*Dome_Rad
600 if ((0.0-RAD_Offset
)+z
) <= 0:
601 verts
.append([x
,0.0,(0.0-RAD_Offset
)+z
])
605 for i
in range(60,160,10):
606 x
= sin(radians(i
))*OtherRad
607 z
= cos(radians(i
))*OtherRad
608 z
= (0.0-OtherRad_Z_Offset
)+z
609 if z
< (0.0-Dome_Height
):
610 z
= (0.0-Dome_Height
)
611 verts
.append([OtherRad_X_Offset
+x
,0.0,z
])
614 verts
.append([SHANK_RADIUS
,0.0,(0.0-Dome_Height
)])
618 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
619 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
621 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
))
623 return sVerts
,faces
,Dome_Height
627 def Create_CounterSink_Head(HOLE_DIA
,HEAD_DIA
,SHANK_DIA
,HEIGHT
,RAD1
):
630 HOLE_RADIUS
= HOLE_DIA
* 0.5
631 HEAD_RADIUS
= HEAD_DIA
* 0.5
632 SHANK_RADIUS
= SHANK_DIA
* 0.5
639 # HEAD_RADIUS = (HEIGHT/tan(radians(60))) + SHANK_RADIUS
640 HEIGHT
= tan(radians(60)) * (HEAD_RADIUS
- SHANK_RADIUS
)
643 FaceStart
= len(verts
)
645 verts
.append([HOLE_RADIUS
,0.0,0.0])
650 for i
in range(0,100,10):
651 x
= sin(radians(i
))*RAD1
652 z
= cos(radians(i
))*RAD1
653 verts
.append([(HEAD_RADIUS
-RAD1
)+x
,0.0,(0.0-RAD1
)+z
])
657 verts
.append([SHANK_RADIUS
,0.0,0.0-HEIGHT
])
661 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
662 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
665 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
,1))
667 return sVerts
,faces
,HEIGHT
672 def Create_Cap_Head(HOLE_DIA
,HEAD_DIA
,SHANK_DIA
,HEIGHT
,RAD1
,RAD2
):
675 HOLE_RADIUS
= HOLE_DIA
* 0.5
676 HEAD_RADIUS
= HEAD_DIA
* 0.5
677 SHANK_RADIUS
= SHANK_DIA
* 0.5
682 BEVEL
= HEIGHT
* 0.01
685 FaceStart
= len(verts
)
687 verts
.append([HOLE_RADIUS
,0.0,0.0])
692 for i
in range(0,100,10):
693 x
= sin(radians(i
))*RAD1
694 z
= cos(radians(i
))*RAD1
695 verts
.append([(HEAD_RADIUS
-RAD1
)+x
,0.0,(0.0-RAD1
)+z
])
699 verts
.append([HEAD_RADIUS
,0.0,0.0-HEIGHT
+BEVEL
])
702 verts
.append([HEAD_RADIUS
-BEVEL
,0.0,0.0-HEIGHT
])
707 for i
in range(0,100,10):
708 x
= sin(radians(i
))*RAD2
709 z
= cos(radians(i
))*RAD2
710 verts
.append([(SHANK_RADIUS
+RAD2
)-x
,0.0,(0.0-HEIGHT
-RAD2
)+z
])
714 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
715 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
718 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
))
720 return sVerts
,faces
,HEIGHT
+RAD2
723 def Create_Hex_Head(FLAT
,HOLE_DIA
,SHANK_DIA
,HEIGHT
):
727 HOLE_RADIUS
= HOLE_DIA
* 0.5
729 TopBevelRadius
= Half_Flat
- (Half_Flat
* (0.05/8))
730 Undercut_Height
= (Half_Flat
* (0.05/8))
731 Shank_Bevel
= (Half_Flat
* (0.05/8))
732 Flat_Height
= HEIGHT
- Undercut_Height
- Shank_Bevel
734 SHANK_RADIUS
= SHANK_DIA
/2
737 verts
.append([0.0,0.0,0.0])
740 FaceStart
= len(verts
)
743 x
= sin(radians(0))*HOLE_RADIUS
744 y
= cos(radians(0))*HOLE_RADIUS
745 verts
.append([x
,y
,0.0])
748 x
= sin(radians(60/6))*HOLE_RADIUS
749 y
= cos(radians(60/6))*HOLE_RADIUS
750 verts
.append([x
,y
,0.0])
753 x
= sin(radians(60/3))*HOLE_RADIUS
754 y
= cos(radians(60/3))*HOLE_RADIUS
755 verts
.append([x
,y
,0.0])
758 x
= sin(radians(60/2))*HOLE_RADIUS
759 y
= cos(radians(60/2))*HOLE_RADIUS
760 verts
.append([x
,y
,0.0])
765 x
= sin(radians(0))*TopBevelRadius
766 y
= cos(radians(0))*TopBevelRadius
767 vec1
= mathutils
.Vector([x
,y
,0.0])
768 verts
.append([x
,y
,0.0])
771 x
= sin(radians(60/6))*TopBevelRadius
772 y
= cos(radians(60/6))*TopBevelRadius
773 vec2
= mathutils
.Vector([x
,y
,0.0])
774 verts
.append([x
,y
,0.0])
777 x
= sin(radians(60/3))*TopBevelRadius
778 y
= cos(radians(60/3))*TopBevelRadius
779 vec3
= mathutils
.Vector([x
,y
,0.0])
780 verts
.append([x
,y
,0.0])
783 x
= sin(radians(60/2))*TopBevelRadius
784 y
= cos(radians(60/2))*TopBevelRadius
785 vec4
= mathutils
.Vector([x
,y
,0.0])
786 verts
.append([x
,y
,0.0])
791 x
= tan(radians(0))*Half_Flat
792 dvec
= vec1
- mathutils
.Vector([x
,Half_Flat
,0.0])
793 verts
.append([x
,Half_Flat
,-dvec
.length
])
796 x
= tan(radians(60/6))*Half_Flat
797 dvec
= vec2
- mathutils
.Vector([x
,Half_Flat
,0.0])
798 verts
.append([x
,Half_Flat
,-dvec
.length
])
801 x
= tan(radians(60/3))*Half_Flat
802 dvec
= vec3
- mathutils
.Vector([x
,Half_Flat
,0.0])
803 Lowest_Point
= -dvec
.length
804 verts
.append([x
,Half_Flat
,-dvec
.length
])
807 x
= tan(radians(60/2))*Half_Flat
808 dvec
= vec4
- mathutils
.Vector([x
,Half_Flat
,0.0])
809 Lowest_Point
= -dvec
.length
810 verts
.append([x
,Half_Flat
,-dvec
.length
])
814 x
= tan(radians(0))*Half_Flat
815 verts
.append([x
,Half_Flat
,Lowest_Point
])
817 x
= tan(radians(60/6))*Half_Flat
818 verts
.append([x
,Half_Flat
,Lowest_Point
])
820 x
= tan(radians(60/3))*Half_Flat
821 verts
.append([x
,Half_Flat
,Lowest_Point
])
823 x
= tan(radians(60/2))*Half_Flat
824 verts
.append([x
,Half_Flat
,Lowest_Point
])
829 x
= tan(radians(0))*Half_Flat
830 verts
.append([x
,Half_Flat
,-Flat_Height
])
832 x
= tan(radians(60/6))*Half_Flat
833 verts
.append([x
,Half_Flat
,-Flat_Height
])
835 x
= tan(radians(60/3))*Half_Flat
836 verts
.append([x
,Half_Flat
,-Flat_Height
])
838 x
= tan(radians(60/2))*Half_Flat
839 verts
.append([x
,Half_Flat
,-Flat_Height
])
845 x
= sin(radians(0))*Half_Flat
846 y
= cos(radians(0))*Half_Flat
847 vec1
= mathutils
.Vector([x
,y
,0.0])
848 verts
.append([x
,y
,-Flat_Height
])
850 x
= sin(radians(60/6))*Half_Flat
851 y
= cos(radians(60/6))*Half_Flat
852 vec2
= mathutils
.Vector([x
,y
,0.0])
853 verts
.append([x
,y
,-Flat_Height
])
855 x
= sin(radians(60/3))*Half_Flat
856 y
= cos(radians(60/3))*Half_Flat
857 vec3
= mathutils
.Vector([x
,y
,0.0])
858 verts
.append([x
,y
,-Flat_Height
])
860 x
= sin(radians(60/2))*Half_Flat
861 y
= cos(radians(60/2))*Half_Flat
862 vec3
= mathutils
.Vector([x
,y
,0.0])
863 verts
.append([x
,y
,-Flat_Height
])
867 x
= sin(radians(0))*Half_Flat
868 y
= cos(radians(0))*Half_Flat
869 vec1
= mathutils
.Vector([x
,y
,0.0])
870 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
872 x
= sin(radians(60/6))*Half_Flat
873 y
= cos(radians(60/6))*Half_Flat
874 vec2
= mathutils
.Vector([x
,y
,0.0])
875 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
877 x
= sin(radians(60/3))*Half_Flat
878 y
= cos(radians(60/3))*Half_Flat
879 vec3
= mathutils
.Vector([x
,y
,0.0])
880 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
882 x
= sin(radians(60/2))*Half_Flat
883 y
= cos(radians(60/2))*Half_Flat
884 vec3
= mathutils
.Vector([x
,y
,0.0])
885 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
888 #under cut to Shank BEVEAL
889 x
= sin(radians(0))*(SHANK_RADIUS
+Shank_Bevel
)
890 y
= cos(radians(0))*(SHANK_RADIUS
+Shank_Bevel
)
891 vec1
= mathutils
.Vector([x
,y
,0.0])
892 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
894 x
= sin(radians(60/6))*(SHANK_RADIUS
+Shank_Bevel
)
895 y
= cos(radians(60/6))*(SHANK_RADIUS
+Shank_Bevel
)
896 vec2
= mathutils
.Vector([x
,y
,0.0])
897 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
899 x
= sin(radians(60/3))*(SHANK_RADIUS
+Shank_Bevel
)
900 y
= cos(radians(60/3))*(SHANK_RADIUS
+Shank_Bevel
)
901 vec3
= mathutils
.Vector([x
,y
,0.0])
902 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
904 x
= sin(radians(60/2))*(SHANK_RADIUS
+Shank_Bevel
)
905 y
= cos(radians(60/2))*(SHANK_RADIUS
+Shank_Bevel
)
906 vec3
= mathutils
.Vector([x
,y
,0.0])
907 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
])
910 #under cut to Shank BEVEAL
911 x
= sin(radians(0))*SHANK_RADIUS
912 y
= cos(radians(0))*SHANK_RADIUS
913 vec1
= mathutils
.Vector([x
,y
,0.0])
914 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
-Shank_Bevel
])
916 x
= sin(radians(60/6))*SHANK_RADIUS
917 y
= cos(radians(60/6))*SHANK_RADIUS
918 vec2
= mathutils
.Vector([x
,y
,0.0])
919 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
-Shank_Bevel
])
921 x
= sin(radians(60/3))*SHANK_RADIUS
922 y
= cos(radians(60/3))*SHANK_RADIUS
923 vec3
= mathutils
.Vector([x
,y
,0.0])
924 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
-Shank_Bevel
])
926 x
= sin(radians(60/2))*SHANK_RADIUS
927 y
= cos(radians(60/2))*SHANK_RADIUS
928 vec3
= mathutils
.Vector([x
,y
,0.0])
929 verts
.append([x
,y
,-Flat_Height
-Undercut_Height
-Shank_Bevel
])
933 #Global_Head_Height = 0 - (-HEIGHT-0.1)
934 faces
.extend(Build_Face_List_Quads(FaceStart
,3,Row
- 1))
937 Mirror_Verts
,Mirror_Faces
= Mirror_Verts_Faces(verts
,faces
,'y')
938 verts
.extend(Mirror_Verts
)
939 faces
.extend(Mirror_Faces
)
941 Spin_Verts
,Spin_Faces
= SpinDup(verts
,faces
,360,6,'z')
944 return Spin_Verts
,Spin_Faces
,0 - (-HEIGHT
)
947 ##########################################################################################
948 ##########################################################################################
949 ## Create External Thread
950 ##########################################################################################
951 ##########################################################################################
955 def Thread_Start3(verts
,INNER_RADIUS
,OUTTER_RADIUS
,PITCH
,DIV
,CREST_PERCENT
,ROOT_PERCENT
,Height_Offset
):
960 # Half_Pitch = float(PITCH)/2 # UNUSED
961 Height_Start
= Height_Offset
- PITCH
962 Height_Step
= float(PITCH
)/float(DIV
)
963 Deg_Step
= 360.0 /float(DIV
)
965 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
966 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
967 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
971 Rank
= float(OUTTER_RADIUS
- INNER_RADIUS
)/float(DIV
)
974 for i
in range(DIV
+1):
975 z
= Height_Offset
- (Height_Step
*i
)
978 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
979 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
980 verts
.append([x
,y
,z
])
981 Height_Offset
-= Crest_Height
984 for i
in range(DIV
+1):
985 z
= Height_Offset
- (Height_Step
*i
)
989 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
990 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
991 verts
.append([x
,y
,z
])
992 Height_Offset
-= Crest_to_Root_Height
996 for i
in range(DIV
+1):
997 z
= Height_Offset
- (Height_Step
*i
)
1001 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1002 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1004 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1005 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1006 verts
.append([x
,y
,z
])
1007 Height_Offset
-= Root_Height
1010 for i
in range(DIV
+1):
1011 z
= Height_Offset
- (Height_Step
*i
)
1012 if z
> Height_Start
:
1015 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1016 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1019 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1020 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1021 verts
.append([x
,y
,z
])
1022 Height_Offset
-= Root_to_Crest_Height
1025 return Ret_Row
,Height_Offset
1028 def Create_Shank_Verts(START_DIA
,OUTTER_DIA
,LENGTH
,Z_LOCATION
= 0):
1033 START_RADIUS
= START_DIA
/2
1034 OUTTER_RADIUS
= OUTTER_DIA
/2
1036 Opp
= abs(START_RADIUS
- OUTTER_RADIUS
)
1037 Taper_Lentgh
= Opp
/tan(radians(31));
1039 if Taper_Lentgh
> LENGTH
:
1042 Stright_Length
= LENGTH
- Taper_Lentgh
1044 Deg_Step
= 360.0 /float(DIV
)
1050 Height_Offset
= Z_LOCATION
1054 for i
in range(DIV
+1):
1055 x
= sin(radians(i
*Deg_Step
))*START_RADIUS
1056 y
= cos(radians(i
*Deg_Step
))*START_RADIUS
1057 z
= Height_Offset
- 0
1058 verts
.append([x
,y
,z
])
1059 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1060 Height_Offset
-= Stright_Length
1063 for i
in range(DIV
+1):
1064 x
= sin(radians(i
*Deg_Step
))*START_RADIUS
1065 y
= cos(radians(i
*Deg_Step
))*START_RADIUS
1066 z
= Height_Offset
- 0
1067 verts
.append([x
,y
,z
])
1068 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1069 Height_Offset
-= Taper_Lentgh
1073 return verts
,Row
,Height_Offset
1076 def Create_Thread_Start_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,CREST_PERCENT
,ROOT_PERCENT
,Z_LOCATION
= 0):
1081 INNER_RADIUS
= INNER_DIA
/2
1082 OUTTER_RADIUS
= OUTTER_DIA
/2
1084 # Half_Pitch = float(PITCH)/2 # UNUSED
1085 Deg_Step
= 360.0 /float(DIV
)
1086 Height_Step
= float(PITCH
)/float(DIV
)
1092 Height_Offset
= Z_LOCATION
1094 Height_Start
= Height_Offset
1096 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1097 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1098 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1100 Rank
= float(OUTTER_RADIUS
- INNER_RADIUS
)/float(DIV
)
1102 Height_Offset
= Z_LOCATION
+ PITCH
1103 Cut_off
= Z_LOCATION
1108 for i
in range(DIV
+1):
1109 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1110 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1111 z
= Height_Offset
- (Height_Step
*i
)
1112 if z
> Cut_off
: z
= Cut_off
1113 verts
.append([x
,y
,z
])
1114 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1115 Height_Offset
-= Crest_Height
1118 for i
in range(DIV
+1):
1119 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1120 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1121 z
= Height_Offset
- (Height_Step
*i
)
1122 if z
> Cut_off
: z
= Cut_off
1123 verts
.append([x
,y
,z
])
1124 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1125 Height_Offset
-= Crest_to_Root_Height
1128 for i
in range(DIV
+1):
1129 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1130 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1131 z
= Height_Offset
- (Height_Step
*i
)
1132 if z
> Cut_off
: z
= Cut_off
1133 verts
.append([x
,y
,z
])
1134 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1135 Height_Offset
-= Root_Height
1138 for i
in range(DIV
+1):
1139 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1140 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1141 z
= Height_Offset
- (Height_Step
*i
)
1142 if z
> Cut_off
: z
= Cut_off
1143 verts
.append([x
,y
,z
])
1144 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1145 Height_Offset
-= Root_to_Crest_Height
1150 for i
in range(DIV
+1):
1151 z
= Height_Offset
- (Height_Step
*i
)
1152 if z
> Height_Start
:
1154 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1155 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1156 verts
.append([x
,y
,z
])
1157 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1158 Height_Offset
-= Crest_Height
1161 for i
in range(DIV
+1):
1162 z
= Height_Offset
- (Height_Step
*i
)
1163 if z
> Height_Start
:
1166 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1167 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1168 verts
.append([x
,y
,z
])
1169 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1170 Height_Offset
-= Crest_to_Root_Height
1174 for i
in range(DIV
+1):
1175 z
= Height_Offset
- (Height_Step
*i
)
1176 if z
> Height_Start
:
1179 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1180 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1182 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1183 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1184 verts
.append([x
,y
,z
])
1185 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1186 Height_Offset
-= Root_Height
1189 for i
in range(DIV
+1):
1190 z
= Height_Offset
- (Height_Step
*i
)
1191 if z
> Height_Start
:
1194 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1195 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1198 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1199 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1200 verts
.append([x
,y
,z
])
1201 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1202 Height_Offset
-= Root_to_Crest_Height
1206 return verts
,Row
,Height_Offset
1210 def Create_Thread_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,HEIGHT
,CREST_PERCENT
,ROOT_PERCENT
,Z_LOCATION
= 0):
1215 INNER_RADIUS
= INNER_DIA
/2
1216 OUTTER_RADIUS
= OUTTER_DIA
/2
1218 # Half_Pitch = float(PITCH)/2 # UNUSED
1219 Deg_Step
= 360.0 /float(DIV
)
1220 Height_Step
= float(PITCH
)/float(DIV
)
1222 NUM_OF_START_THREADS
= 4.0
1223 NUM_OF_END_THREADS
= 3.0
1224 Num
= int((HEIGHT
- ((NUM_OF_START_THREADS
*PITCH
) + (NUM_OF_END_THREADS
*PITCH
) ))/PITCH
)
1228 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1229 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1230 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1233 Height_Offset
= Z_LOCATION
1237 for j
in range(Num
):
1239 for i
in range(DIV
+1):
1240 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1241 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1242 z
= Height_Offset
- (Height_Step
*i
)
1243 verts
.append([x
,y
,z
])
1244 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1245 Height_Offset
-= Crest_Height
1248 for i
in range(DIV
+1):
1249 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1250 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1251 z
= Height_Offset
- (Height_Step
*i
)
1252 verts
.append([x
,y
,z
])
1253 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1254 Height_Offset
-= Crest_to_Root_Height
1258 for i
in range(DIV
+1):
1259 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1260 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1261 z
= Height_Offset
- (Height_Step
*i
)
1262 verts
.append([x
,y
,z
])
1263 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1264 Height_Offset
-= Root_Height
1267 for i
in range(DIV
+1):
1268 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1269 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1270 z
= Height_Offset
- (Height_Step
*i
)
1271 verts
.append([x
,y
,z
])
1272 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1273 Height_Offset
-= Root_to_Crest_Height
1276 return verts
,Row
,Height_Offset
1280 def Create_Thread_End_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,CREST_PERCENT
,ROOT_PERCENT
,Z_LOCATION
= 0):
1285 INNER_RADIUS
= INNER_DIA
/2
1286 OUTTER_RADIUS
= OUTTER_DIA
/2
1288 # Half_Pitch = float(PITCH)/2 # UNUSED
1289 Deg_Step
= 360.0 /float(DIV
)
1290 Height_Step
= float(PITCH
)/float(DIV
)
1292 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1293 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1294 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1299 Height_Offset
= Z_LOCATION
1301 Tapper_Height_Start
= Height_Offset
- PITCH
- PITCH
1303 Max_Height
= Tapper_Height_Start
- PITCH
1307 # FaceStart = len(verts) # UNUSED
1310 for i
in range(DIV
+1):
1311 z
= Height_Offset
- (Height_Step
*i
)
1312 z
= max(z
,Max_Height
)
1313 Tapper_Radius
= OUTTER_RADIUS
1314 if z
< Tapper_Height_Start
:
1315 Tapper_Radius
= OUTTER_RADIUS
- (Tapper_Height_Start
- z
)
1317 x
= sin(radians(i
*Deg_Step
))*(Tapper_Radius
)
1318 y
= cos(radians(i
*Deg_Step
))*(Tapper_Radius
)
1319 verts
.append([x
,y
,z
])
1320 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1321 Height_Offset
-= Crest_Height
1324 for i
in range(DIV
+1):
1325 z
= Height_Offset
- (Height_Step
*i
)
1326 z
= max(z
,Max_Height
)
1327 Tapper_Radius
= OUTTER_RADIUS
1328 if z
< Tapper_Height_Start
:
1329 Tapper_Radius
= OUTTER_RADIUS
- (Tapper_Height_Start
- z
)
1331 x
= sin(radians(i
*Deg_Step
))*(Tapper_Radius
)
1332 y
= cos(radians(i
*Deg_Step
))*(Tapper_Radius
)
1333 verts
.append([x
,y
,z
])
1334 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1335 Height_Offset
-= Crest_to_Root_Height
1339 for i
in range(DIV
+1):
1340 z
= Height_Offset
- (Height_Step
*i
)
1341 z
= max(z
,Max_Height
)
1342 Tapper_Radius
= OUTTER_RADIUS
- (Tapper_Height_Start
- z
)
1343 if Tapper_Radius
> INNER_RADIUS
:
1344 Tapper_Radius
= INNER_RADIUS
1346 x
= sin(radians(i
*Deg_Step
))*(Tapper_Radius
)
1347 y
= cos(radians(i
*Deg_Step
))*(Tapper_Radius
)
1348 verts
.append([x
,y
,z
])
1349 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1350 Height_Offset
-= Root_Height
1353 for i
in range(DIV
+1):
1354 z
= Height_Offset
- (Height_Step
*i
)
1355 z
= max(z
,Max_Height
)
1356 Tapper_Radius
= OUTTER_RADIUS
- (Tapper_Height_Start
- z
)
1357 if Tapper_Radius
> INNER_RADIUS
:
1358 Tapper_Radius
= INNER_RADIUS
1360 x
= sin(radians(i
*Deg_Step
))*(Tapper_Radius
)
1361 y
= cos(radians(i
*Deg_Step
))*(Tapper_Radius
)
1362 verts
.append([x
,y
,z
])
1363 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1364 Height_Offset
-= Root_to_Crest_Height
1367 return verts
,Row
,Height_Offset
,Lowest_Z_Vert
1372 def Create_External_Thread(SHANK_DIA
,SHANK_LENGTH
,INNER_DIA
,OUTTER_DIA
,PITCH
,LENGTH
,CREST_PERCENT
,ROOT_PERCENT
):
1380 # Thread_Len = 0 # UNUSED
1382 Face_Start
= len(verts
)
1386 Shank_Verts
,Shank_Row
,Offset
= Create_Shank_Verts(SHANK_DIA
,OUTTER_DIA
,SHANK_LENGTH
,Offset
)
1387 Total_Row
+= Shank_Row
1389 Thread_Start_Verts
,Thread_Start_Row
,Offset
= Create_Thread_Start_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,CREST_PERCENT
,ROOT_PERCENT
,Offset
)
1390 Total_Row
+= Thread_Start_Row
1393 Thread_Verts
,Thread_Row
,Offset
= Create_Thread_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,LENGTH
,CREST_PERCENT
,ROOT_PERCENT
,Offset
)
1394 Total_Row
+= Thread_Row
1397 Thread_End_Verts
,Thread_End_Row
,Offset
,Lowest_Z_Vert
= Create_Thread_End_Verts(INNER_DIA
,OUTTER_DIA
,PITCH
,CREST_PERCENT
,ROOT_PERCENT
,Offset
)
1398 Total_Row
+= Thread_End_Row
1401 verts
.extend(Shank_Verts
)
1402 verts
.extend(Thread_Start_Verts
)
1403 verts
.extend(Thread_Verts
)
1404 verts
.extend(Thread_End_Verts
)
1406 faces
.extend(Build_Face_List_Quads(Face_Start
,DIV
,Total_Row
-1,0))
1407 faces
.extend(Fill_Ring_Face(len(verts
)-DIV
,DIV
,1))
1409 return verts
,faces
,0.0 - Lowest_Z_Vert
1412 ##########################################################################################
1413 ##########################################################################################
1415 ##########################################################################################
1416 ##########################################################################################
1418 def add_Hex_Nut(FLAT
,HOLE_DIA
,HEIGHT
):
1419 global Global_Head_Height
1420 global Global_NutRad
1424 HOLE_RADIUS
= HOLE_DIA
* 0.5
1426 Half_Height
= HEIGHT
/2
1427 TopBevelRadius
= Half_Flat
- 0.05
1429 Global_NutRad
= TopBevelRadius
1432 Lowest_Z_Vert
= 0.0;
1434 verts
.append([0.0,0.0,0.0])
1437 FaceStart
= len(verts
)
1440 x
= sin(radians(0))*HOLE_RADIUS
1441 y
= cos(radians(0))*HOLE_RADIUS
1442 #print ("rad 0 x;", x, "y:" ,y )
1443 verts
.append([x
,y
,0.0])
1446 x
= sin(radians(60/6))*HOLE_RADIUS
1447 y
= cos(radians(60/6))*HOLE_RADIUS
1448 #print ("rad 60/6x;", x, "y:" ,y )
1449 verts
.append([x
,y
,0.0])
1452 x
= sin(radians(60/3))*HOLE_RADIUS
1453 y
= cos(radians(60/3))*HOLE_RADIUS
1454 #print ("rad 60/3x;", x, "y:" ,y )
1455 verts
.append([x
,y
,0.0])
1458 x
= sin(radians(60/2))*HOLE_RADIUS
1459 y
= cos(radians(60/2))*HOLE_RADIUS
1460 #print ("rad 60/2x;", x, "y:" ,y )
1461 verts
.append([x
,y
,0.0])
1467 x
= sin(radians(0))*TopBevelRadius
1468 y
= cos(radians(0))*TopBevelRadius
1469 vec1
= mathutils
.Vector([x
,y
,0.0])
1470 verts
.append([x
,y
,0.0])
1473 x
= sin(radians(60/6))*TopBevelRadius
1474 y
= cos(radians(60/6))*TopBevelRadius
1475 vec2
= mathutils
.Vector([x
,y
,0.0])
1476 verts
.append([x
,y
,0.0])
1479 x
= sin(radians(60/3))*TopBevelRadius
1480 y
= cos(radians(60/3))*TopBevelRadius
1481 vec3
= mathutils
.Vector([x
,y
,0.0])
1482 verts
.append([x
,y
,0.0])
1485 x
= sin(radians(60/2))*TopBevelRadius
1486 y
= cos(radians(60/2))*TopBevelRadius
1487 vec4
= mathutils
.Vector([x
,y
,0.0])
1488 verts
.append([x
,y
,0.0])
1493 x
= tan(radians(0))*Half_Flat
1494 dvec
= vec1
- mathutils
.Vector([x
,Half_Flat
,0.0])
1495 verts
.append([x
,Half_Flat
,-dvec
.length
])
1496 Lowest_Z_Vert
= min(Lowest_Z_Vert
,-dvec
.length
)
1499 x
= tan(radians(60/6))*Half_Flat
1500 dvec
= vec2
- mathutils
.Vector([x
,Half_Flat
,0.0])
1501 verts
.append([x
,Half_Flat
,-dvec
.length
])
1502 Lowest_Z_Vert
= min(Lowest_Z_Vert
,-dvec
.length
)
1505 x
= tan(radians(60/3))*Half_Flat
1506 dvec
= vec3
- mathutils
.Vector([x
,Half_Flat
,0.0])
1507 Lowest_Point
= -dvec
.length
1508 verts
.append([x
,Half_Flat
,-dvec
.length
])
1509 Lowest_Z_Vert
= min(Lowest_Z_Vert
,-dvec
.length
)
1511 x
= tan(radians(60/2))*Half_Flat
1512 dvec
= vec4
- mathutils
.Vector([x
,Half_Flat
,0.0])
1513 Lowest_Point
= -dvec
.length
1514 verts
.append([x
,Half_Flat
,-dvec
.length
])
1515 Lowest_Z_Vert
= min(Lowest_Z_Vert
,-dvec
.length
)
1519 x
= tan(radians(0))*Half_Flat
1520 verts
.append([x
,Half_Flat
,Lowest_Point
])
1523 x
= tan(radians(60/6))*Half_Flat
1524 verts
.append([x
,Half_Flat
,Lowest_Point
])
1525 x
= tan(radians(60/3))*Half_Flat
1526 verts
.append([x
,Half_Flat
,Lowest_Point
])
1528 x
= tan(radians(60/2))*Half_Flat
1529 verts
.append([x
,Half_Flat
,Lowest_Point
])
1530 Lowest_Z_Vert
= min(Lowest_Z_Vert
,Lowest_Point
)
1535 x
= tan(radians(0))*Half_Flat
1536 verts
.append([x
,Half_Flat
,-Half_Height
])
1538 x
= tan(radians(60/6))*Half_Flat
1539 verts
.append([x
,Half_Flat
,-Half_Height
])
1541 x
= tan(radians(60/3))*Half_Flat
1542 verts
.append([x
,Half_Flat
,-Half_Height
])
1544 x
= tan(radians(60/2))*Half_Flat
1545 verts
.append([x
,Half_Flat
,-Half_Height
])
1546 Lowest_Z_Vert
= min(Lowest_Z_Vert
,-Half_Height
)
1549 faces
.extend(Build_Face_List_Quads(FaceStart
,3,Row
- 1))
1551 Global_Head_Height
= HEIGHT
1553 Tvert
,tface
= Mirror_Verts_Faces(verts
,faces
,'z',Lowest_Z_Vert
)
1558 Tvert
,tface
= Mirror_Verts_Faces(verts
,faces
,'y')
1562 S_verts
,S_faces
= SpinDup(verts
,faces
,360,6,'z')
1564 #return verts,faces,TopBevelRadius
1565 return S_verts
,S_faces
,TopBevelRadius
1569 def add_Nylon_Head(OUTSIDE_RADIUS
,Z_LOCATION
= 0):
1575 INNER_HOLE
= OUTSIDE_RADIUS
- (OUTSIDE_RADIUS
* (1.25/4.75))
1576 EDGE_THICKNESS
= (OUTSIDE_RADIUS
* (0.4/4.75))
1577 RAD1
= (OUTSIDE_RADIUS
* (0.5/4.75))
1578 OVER_ALL_HEIGTH
= (OUTSIDE_RADIUS
* (2.0/4.75))
1581 FaceStart
= len(verts
)
1583 # Start_Height = 0 - 3 # UNUSED
1584 Height_Offset
= Z_LOCATION
1588 z
= (Height_Offset
- OVER_ALL_HEIGTH
) + EDGE_THICKNESS
1589 verts
.append([x
,0.0,z
])
1590 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1594 z
= (Height_Offset
- OVER_ALL_HEIGTH
)
1595 verts
.append([x
,0.0,z
])
1596 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1600 for i
in range(180,80,-10):
1601 x
= sin(radians(i
))*RAD1
1602 z
= cos(radians(i
))*RAD1
1603 verts
.append([(OUTSIDE_RADIUS
-RAD1
)+x
,0.0,((Height_Offset
- OVER_ALL_HEIGTH
)+RAD1
)+z
])
1604 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1608 x
= OUTSIDE_RADIUS
- 0
1610 verts
.append([x
,0.0,z
])
1611 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1614 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
1615 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
1617 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
))
1619 return Move_Verts_Up_Z(sVerts
,0),faces
,Lowest_Z_Vert
1623 def add_Nylon_Part(OUTSIDE_RADIUS
,Z_LOCATION
= 0):
1629 INNER_HOLE
= OUTSIDE_RADIUS
- (OUTSIDE_RADIUS
* (1.5/4.75))
1630 EDGE_THICKNESS
= (OUTSIDE_RADIUS
* (0.4/4.75))
1631 # RAD1 = (OUTSIDE_RADIUS * (0.5/4.75)) # UNUSED
1632 OVER_ALL_HEIGTH
= (OUTSIDE_RADIUS
* (2.0/4.75))
1633 PART_THICKNESS
= OVER_ALL_HEIGTH
- EDGE_THICKNESS
1634 PART_INNER_HOLE
= (OUTSIDE_RADIUS
* (2.5/4.75))
1636 FaceStart
= len(verts
)
1638 # Start_Height = 0 - 3 # UNUSED
1639 Height_Offset
= Z_LOCATION
1643 x
= INNER_HOLE
+ EDGE_THICKNESS
1645 verts
.append([x
,0.0,z
])
1646 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1651 verts
.append([x
,0.0,z
])
1652 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1656 z
= Height_Offset
- PART_THICKNESS
1657 verts
.append([x
,0.0,z
])
1658 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1661 x
= INNER_HOLE
+ EDGE_THICKNESS
1662 z
= Height_Offset
- PART_THICKNESS
1663 verts
.append([x
,0.0,z
])
1664 Lowest_Z_Vert
= min(Lowest_Z_Vert
,z
)
1668 sVerts
,sFaces
= SpinDup(verts
,faces
,360,DIV
,'z')
1669 sVerts
.extend(verts
) #add the start verts to the Spin verts to complete the loop
1671 faces
.extend(Build_Face_List_Quads(FaceStart
,Row
-1,DIV
,1))
1673 return sVerts
,faces
,0 - Lowest_Z_Vert
1676 ##########################################################################################
1677 ##########################################################################################
1678 ## Create Internal Thread
1679 ##########################################################################################
1680 ##########################################################################################
1683 def Create_Internal_Thread_Start_Verts(verts
,INNER_RADIUS
,OUTTER_RADIUS
,PITCH
,DIV
,CREST_PERCENT
,ROOT_PERCENT
,Height_Offset
):
1688 Height_Offset
= Height_Offset
+ PITCH
#Move the offset up so that the verts start at
1689 #at the correct place (Height_Start)
1691 # Half_Pitch = float(PITCH)/2 # UNUSED
1692 Height_Start
= Height_Offset
- PITCH
1693 Height_Step
= float(PITCH
)/float(DIV
)
1694 Deg_Step
= 360.0 /float(DIV
)
1696 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1697 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1698 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1701 Rank
= float(OUTTER_RADIUS
- INNER_RADIUS
)/float(DIV
)
1702 for j
in range(1): #FIXME - for j in range(1) what?!
1704 for i
in range(DIV
+1):
1705 z
= Height_Offset
- (Height_Step
*i
)
1706 if z
> Height_Start
:
1708 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1709 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1710 verts
.append([x
,y
,z
])
1711 Height_Offset
-= Crest_Height
1714 for i
in range(DIV
+1):
1715 z
= Height_Offset
- (Height_Step
*i
)
1716 if z
> Height_Start
:
1719 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1720 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1721 verts
.append([x
,y
,z
])
1722 Height_Offset
-= Crest_to_Root_Height
1726 for i
in range(DIV
+1):
1727 z
= Height_Offset
- (Height_Step
*i
)
1728 if z
> Height_Start
:
1731 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1732 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1734 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1735 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1736 verts
.append([x
,y
,z
])
1737 Height_Offset
-= Root_Height
1740 for i
in range(DIV
+1):
1741 z
= Height_Offset
- (Height_Step
*i
)
1742 if z
> Height_Start
:
1745 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1746 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1749 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1750 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
- (i
*Rank
))
1751 verts
.append([x
,y
,z
])
1752 Height_Offset
-= Root_to_Crest_Height
1755 return Ret_Row
,Height_Offset
1758 def Create_Internal_Thread_End_Verts(verts
,INNER_RADIUS
,OUTTER_RADIUS
,PITCH
,DIV
,CREST_PERCENT
,ROOT_PERCENT
,Height_Offset
):
1763 # Half_Pitch = float(PITCH)/2 # UNUSED
1764 #Height_End = Height_Offset - PITCH - PITCH - PITCH- PITCH - PITCH- PITCH
1765 Height_End
= Height_Offset
- PITCH
1767 Height_Step
= float(PITCH
)/float(DIV
)
1768 Deg_Step
= 360.0 /float(DIV
)
1770 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1771 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1772 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1775 Rank
= float(OUTTER_RADIUS
- INNER_RADIUS
)/float(DIV
)
1781 for i
in range(DIV
+1):
1782 z
= Height_Offset
- (Height_Step
*i
)
1785 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1786 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1787 verts
.append([x
,y
,z
])
1788 Height_Offset
-= Crest_Height
1792 for i
in range(DIV
+1):
1793 z
= Height_Offset
- (Height_Step
*i
)
1797 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1798 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1799 verts
.append([x
,y
,z
])
1800 Height_Offset
-= Crest_to_Root_Height
1804 for i
in range(DIV
+1):
1805 z
= Height_Offset
- (Height_Step
*i
)
1809 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1810 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1812 x
= sin(radians(i
*Deg_Step
))*(INNER_RADIUS
+ (i
*Rank
))
1813 y
= cos(radians(i
*Deg_Step
))*(INNER_RADIUS
+ (i
*Rank
))
1815 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
)
1816 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
)
1818 verts
.append([x
,y
,z
])
1819 Height_Offset
-= Root_Height
1823 for i
in range(DIV
+1):
1824 z
= Height_Offset
- (Height_Step
*i
)
1828 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1829 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1832 x
= sin(radians(i
*Deg_Step
))*(INNER_RADIUS
+ (i
*Rank
))
1833 y
= cos(radians(i
*Deg_Step
))*(INNER_RADIUS
+ (i
*Rank
))
1835 x
= sin(radians(i
*Deg_Step
))*(OUTTER_RADIUS
)
1836 y
= cos(radians(i
*Deg_Step
))*(OUTTER_RADIUS
)
1838 verts
.append([x
,y
,z
])
1839 Height_Offset
-= Root_to_Crest_Height
1843 return Ret_Row
,Height_End
# send back Height End as this is the lowest point
1846 def Create_Internal_Thread(INNER_DIA
,OUTTER_DIA
,PITCH
,HEIGHT
,CREST_PERCENT
,ROOT_PERCENT
,INTERNAL
= 1):
1852 INNER_RADIUS
= INNER_DIA
/2
1853 OUTTER_RADIUS
= OUTTER_DIA
/2
1855 # Half_Pitch = float(PITCH)/2 # UNUSED
1856 Deg_Step
= 360.0 /float(DIV
)
1857 Height_Step
= float(PITCH
)/float(DIV
)
1859 Num
= int(round((HEIGHT
- PITCH
)/PITCH
)) # less one pitch for the start and end that is 1/2 pitch high
1865 Crest_Height
= float(PITCH
) * float(CREST_PERCENT
)/float(100)
1866 Root_Height
= float(PITCH
) * float(ROOT_PERCENT
)/float(100)
1867 Root_to_Crest_Height
= Crest_to_Root_Height
= (float(PITCH
) - (Crest_Height
+ Root_Height
))/2.0
1870 FaceStart
= len(verts
)
1872 Row_Inc
,Height_Offset
= Create_Internal_Thread_Start_Verts(verts
,INNER_RADIUS
,OUTTER_RADIUS
,PITCH
,DIV
,CREST_PERCENT
,ROOT_PERCENT
,Height_Offset
)
1875 for j
in range(Num
):
1877 for i
in range(DIV
+1):
1878 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1879 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1880 verts
.append([x
,y
,Height_Offset
- (Height_Step
*i
) ])
1881 Height_Offset
-= Crest_Height
1884 for i
in range(DIV
+1):
1885 x
= sin(radians(i
*Deg_Step
))*OUTTER_RADIUS
1886 y
= cos(radians(i
*Deg_Step
))*OUTTER_RADIUS
1887 verts
.append([x
,y
,Height_Offset
- (Height_Step
*i
) ])
1888 Height_Offset
-= Crest_to_Root_Height
1891 for i
in range(DIV
+1):
1892 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1893 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1894 verts
.append([x
,y
,Height_Offset
- (Height_Step
*i
) ])
1895 Height_Offset
-= Root_Height
1898 for i
in range(DIV
+1):
1899 x
= sin(radians(i
*Deg_Step
))*INNER_RADIUS
1900 y
= cos(radians(i
*Deg_Step
))*INNER_RADIUS
1901 verts
.append([x
,y
,Height_Offset
- (Height_Step
*i
) ])
1902 Height_Offset
-= Root_to_Crest_Height
1906 Row_Inc
,Height_Offset
= Create_Internal_Thread_End_Verts(verts
,INNER_RADIUS
,OUTTER_RADIUS
,PITCH
,DIV
,CREST_PERCENT
,ROOT_PERCENT
,Height_Offset
)
1909 faces
.extend(Build_Face_List_Quads(FaceStart
,DIV
,Row
-1,INTERNAL
))
1911 return verts
,faces
,0 - Height_Offset
1914 def Nut_Mesh(props
, context
):
1924 Face_Start
= len(verts
)
1925 Thread_Verts
,Thread_Faces
,New_Nut_Height
= Create_Internal_Thread(props
.bf_Minor_Dia
,props
.bf_Major_Dia
,props
.bf_Pitch
,props
.bf_Hex_Nut_Height
,props
.bf_Crest_Percent
,props
.bf_Root_Percent
,1)
1926 verts
.extend(Thread_Verts
)
1927 faces
.extend(Copy_Faces(Thread_Faces
,Face_Start
))
1929 Face_Start
= len(verts
)
1930 Head_Verts
,Head_Faces
,Lock_Nut_Rad
= add_Hex_Nut(props
.bf_Hex_Nut_Flat_Distance
,props
.bf_Major_Dia
,New_Nut_Height
)
1931 verts
.extend((Head_Verts
))
1932 faces
.extend(Copy_Faces(Head_Faces
,Face_Start
))
1934 LowZ
= 0 - New_Nut_Height
1936 if props
.bf_Nut_Type
== 'bf_Nut_Lock':
1937 Face_Start
= len(verts
)
1938 Nylon_Head_Verts
,Nylon_Head_faces
,LowZ
= add_Nylon_Head(Lock_Nut_Rad
,0-New_Nut_Height
)
1939 verts
.extend((Nylon_Head_Verts
))
1940 faces
.extend(Copy_Faces(Nylon_Head_faces
,Face_Start
))
1942 Face_Start
= len(verts
)
1943 Nylon_Verts
,Nylon_faces
,Temp_LowZ
= add_Nylon_Part(Lock_Nut_Rad
,0-New_Nut_Height
)
1944 verts
.extend((Nylon_Verts
))
1945 faces
.extend(Copy_Faces(Nylon_faces
,Face_Start
))
1948 return Move_Verts_Up_Z(verts
,0 - LowZ
),faces
1952 ##########################################################################################
1953 ##########################################################################################
1954 ##########################################################################################
1956 ##########################################################################################
1957 ##########################################################################################
1961 def Bolt_Mesh(props
, context
):
1974 ReSized_Allen_Bit_Flat_Distance
= props
.bf_Allen_Bit_Flat_Distance
# set default
1977 Head_Height
= props
.bf_Hex_Head_Height
# will be changed by the Head Functions
1980 if props
.bf_Bit_Type
== 'bf_Bit_Allen' and props
.bf_Head_Type
== 'bf_Head_Pan':
1981 #need to size Allen bit if it is too big.
1982 if Allen_Bit_Dia(props
.bf_Allen_Bit_Flat_Distance
) > Max_Pan_Bit_Dia(props
.bf_Pan_Head_Dia
):
1983 ReSized_Allen_Bit_Flat_Distance
= Allen_Bit_Dia_To_Flat(Max_Pan_Bit_Dia(props
.bf_Pan_Head_Dia
)) * 1.05
1984 #print ("Resized Allen Bit Flat Distance to ",ReSized_Allen_Bit_Flat_Distance)
1987 if props
.bf_Bit_Type
== 'bf_Bit_Allen':
1988 Bit_Verts
,Bit_Faces
,Bit_Dia
= Create_Allen_Bit(ReSized_Allen_Bit_Flat_Distance
,props
.bf_Allen_Bit_Depth
)
1990 if props
.bf_Bit_Type
== 'bf_Bit_Philips':
1991 Bit_Verts
,Bit_Faces
,Bit_Dia
= Create_Phillips_Bit(props
.bf_Philips_Bit_Dia
,props
.bf_Philips_Bit_Dia
*(0.5/1.82),props
.bf_Phillips_Bit_Depth
)
1996 if props
.bf_Head_Type
=='bf_Head_Hex':
1997 Head_Verts
,Head_Faces
,Head_Height
= Create_Hex_Head(props
.bf_Hex_Head_Flat_Distance
,Bit_Dia
,props
.bf_Shank_Dia
,props
.bf_Hex_Head_Height
)
1999 elif props
.bf_Head_Type
== 'bf_Head_Cap':
2000 Head_Verts
,Head_Faces
,Head_Height
= Create_Cap_Head(Bit_Dia
,props
.bf_Cap_Head_Dia
,props
.bf_Shank_Dia
,props
.bf_Cap_Head_Height
,props
.bf_Cap_Head_Dia
*(1.0/19.0),props
.bf_Cap_Head_Dia
*(1.0/19.0))
2002 elif props
.bf_Head_Type
=='bf_Head_Dome':
2003 Head_Verts
,Head_Faces
,Head_Height
= Create_Dome_Head(Bit_Dia
,props
.bf_Dome_Head_Dia
,props
.bf_Shank_Dia
,props
.bf_Hex_Head_Height
,1,1,0)
2005 elif props
.bf_Head_Type
== 'bf_Head_Pan':
2006 Head_Verts
,Head_Faces
,Head_Height
= Create_Pan_Head(Bit_Dia
,props
.bf_Pan_Head_Dia
,props
.bf_Shank_Dia
,props
.bf_Hex_Head_Height
,1,1,0)
2008 elif props
.bf_Head_Type
== 'bf_Head_CounterSink':
2009 Head_Verts
,Head_Faces
,Head_Height
= Create_CounterSink_Head(Bit_Dia
,props
.bf_CounterSink_Head_Dia
,props
.bf_Shank_Dia
,props
.bf_CounterSink_Head_Dia
,props
.bf_CounterSink_Head_Dia
*(0.09/6.31))
2010 #Head_Verts,Head_Faces,Head_Height = Create_CounterSink_Head(Bit_Dia,props.bf_CounterSink_Head_Dia,props.bf_Shank_Dia,props.bf_CounterSink_Head_Dia,props.bf_CounterSink_Head_Dia*(1.0/19.0))
2012 Face_Start
= len(verts
)
2013 verts
.extend(Move_Verts_Up_Z(Bit_Verts
,Head_Height
))
2014 faces
.extend(Copy_Faces(Bit_Faces
,Face_Start
))
2016 Face_Start
= len(verts
)
2017 verts
.extend(Move_Verts_Up_Z(Head_Verts
,Head_Height
))
2018 faces
.extend(Copy_Faces(Head_Faces
,Face_Start
))
2020 Face_Start
= len(verts
)
2021 Thread_Verts
,Thread_Faces
,Thread_Height
= Create_External_Thread(props
.bf_Shank_Dia
,props
.bf_Shank_Length
,props
.bf_Minor_Dia
,props
.bf_Major_Dia
,props
.bf_Pitch
,props
.bf_Thread_Length
,props
.bf_Crest_Percent
,props
.bf_Root_Percent
)
2023 verts
.extend(Move_Verts_Up_Z(Thread_Verts
,00))
2024 faces
.extend(Copy_Faces(Thread_Faces
,Face_Start
))
2026 return Move_Verts_Up_Z(verts
,Thread_Height
),faces
2028 # calculates the matrix for the new object
2029 # depending on user pref
2030 def align_matrix(context
):
2031 loc
= Matrix
.Translation(context
.scene
.cursor_location
)
2032 obj_align
= context
.user_preferences
.edit
.object_align
2033 if (context
.space_data
.type == 'VIEW_3D'
2034 and obj_align
== 'VIEW'):
2035 rot
= context
.space_data
.region_3d
.view_matrix
.to_3x3().inverted().to_4x4()
2038 align_matrix
= loc
* rot
2042 # Create a new mesh (object) from verts/edges/faces.
2043 # verts/edges/faces ... List of vertices/edges/faces for the
2044 # new mesh (as used in from_pydata).
2045 # name ... Name of the new mesh (& object).
2046 # edit ... Replace existing mesh data.
2047 # Note: Using "edit" will destroy/delete existing mesh data.
2048 def create_mesh_object(context
, verts
, edges
, faces
, name
, edit
, align_matrix
):
2049 scene
= context
.scene
2050 obj_act
= scene
.objects
.active
2052 # Can't edit anything, unless we have an active obj.
2053 if edit
and not obj_act
:
2057 mesh
= bpy
.data
.meshes
.new(name
)
2059 # Make a mesh from a list of verts/edges/faces.
2060 mesh
.from_pydata(verts
, edges
, faces
)
2062 # Update mesh geometry after adding stuff.
2065 # Deselect all objects when in object mode
2066 if bpy
.ops
.object.select_all
.poll():
2067 bpy
.ops
.object.select_all(action
='DESELECT')
2070 # Replace geometry of existing object
2072 # Use the active obj and select it.
2074 ob_new
.select
= True
2076 if obj_act
.mode
== 'OBJECT':
2077 # Get existing mesh datablock.
2078 old_mesh
= ob_new
.data
2080 # Set object data to nothing
2083 # Clear users of existing mesh datablock.
2084 old_mesh
.user_clear()
2086 # Remove old mesh datablock if no users are left.
2087 if (old_mesh
.users
== 0):
2088 bpy
.data
.meshes
.remove(old_mesh
)
2090 # Assign new mesh datablock.
2095 ob_new
= bpy
.data
.objects
.new(name
, mesh
)
2097 # Link new object to the given scene and select it.
2098 scene
.objects
.link(ob_new
)
2099 ob_new
.select
= True
2101 # Place the object at the 3D cursor location.
2103 ob_new
.matrix_world
= align_matrix
2105 if obj_act
and obj_act
.mode
== 'EDIT':
2107 # We are in EditMode, switch to ObjectMode.
2108 bpy
.ops
.object.mode_set(mode
='OBJECT')
2110 # Select the active object as well.
2111 obj_act
.select
= True
2113 # Apply location of new object.
2116 # Join new object into the active.
2117 bpy
.ops
.object.join()
2119 # Switching back to EditMode.
2120 bpy
.ops
.object.mode_set(mode
='EDIT')
2125 # We are in ObjectMode.
2126 # Make the new object the active one.
2127 scene
.objects
.active
= ob_new
2132 def Create_New_Mesh(props
, context
, align_matrix
):
2136 # sMeshName ='' # UNUSED
2139 if props
.bf_Model_Type
== 'bf_Model_Bolt':
2140 #print('Create Bolt')
2141 verts
, faces
= Bolt_Mesh(props
, context
)
2142 # sMeshName = 'Bolt' # UNUSED
2145 if props
.bf_Model_Type
== 'bf_Model_Nut':
2146 #print('Create Nut')
2147 verts
, faces
= Nut_Mesh(props
, context
)
2148 # sMeshName = 'Nut' # UNUSED
2152 verts
, faces
= RemoveDoubles(verts
, faces
)
2154 verts
= Scale_Mesh_Verts(verts
,GLOBAL_SCALE
)
2156 obj
= create_mesh_object(context
, verts
, [], faces
,sObjName
,
2157 props
.edit
, align_matrix
)