–SolidPython学习笔记3
参考Parkinbotshortcuts.scad做了部分修改使得代码更为简洁易读
以下是对solidpython的readme的学习笔记(其中的部分code进行了简化):
在初探1中我们初步实现了螺纹的3D建模
还通过fig动态演示了建模过程,代码有点啰嗦,还需要优化
接下来,我们的任务是实现标准化定制,和非标准化定制
先从标准化定制开始吧,首先学习基础知识
–from ISO metric screw thread
所有ISO公制螺纹的轮廓
ISO通用公制螺纹(“M”系列螺纹)的设计原则在国际标准ISO 68-1中定义。[2]每个线程的特征在于其主径_D_(图中的_D_maj)及其螺距_P_。ISO公制螺纹由对称的V形螺纹组成。在螺纹轴的平面中,V的侧面彼此具有60°的角度。螺纹深度为0.614×螺距。从型材上切下V形高度_H_的最外1/8和最内1/4。
高度H和螺距P之间的关系使用以下等式求出,其中θ是线程的夹角的一半,即30度:
\begin{aligned}H = \frac {1}{2\tan\theta} \cdot P = \frac {\sqrt 3}{2}\cdot P \approx 0.866 \cdot P\end{aligned}
<公式1>
\begin{aligned}P = 2\tan\theta\cdot H = \frac{2}{\sqrt 3} \cdot H \approx 1.155 \cdot H\end{aligned}
<公式2>
在外(阳)螺纹(例如,在螺栓上),大直径Dmaj和小直径Dmin限定螺纹的最大尺寸。这意味着外螺纹必须在Dmaj处平坦,但可以在小直径Dmin以下圆整。相反,在内(阴)螺纹(例如,在螺母中)中,主要和次要直径是最小尺寸;因此,螺纹轮廓必须在Dmin处平坦,但可能会超出Dmaj。
小直径Dmin和有效节圆直径Dp来自大直径和螺距
\begin{aligned}D_{\text{min}}=D_{\text{maj}}-2\cdot {\frac {5}{8}}\cdot H=D_{\text{maj}}-{\frac {5{\sqrt {3}}}{8}}\cdot P\approx D_{\text{maj}}-1.082532\cdot P\end{aligned}
<公式3>
\begin{aligned}D_{\text{p}}=D_{\text{maj}}-2\cdot {\frac {3}{8}}\cdot H=D_{\text{maj}}-{\frac {3{\sqrt {3}}}{8}}\cdot P\approx D_{\text{maj}}-0.649519\cdot P\end{aligned}
<公式4>
# 先做个截面
from solid import *
from solid.utils import *
import viewscad
import os
import sys
import numpy as np
import pandas as pd
from decimal import *
r = viewscad.Renderer(openscad_exec='/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD')
Dmaj = 10
Rmaj = Dmaj / 2
P = 1
length = 10
#螺丝的总长
sn = 36 #圆段
H = .866 * P
def thread_sec(Dmaj, P, length):#Dmaj:主径,P:螺距
# 公式1
c = P3([[0, 0, 0], [0, 0,P / 2], [Dmaj / 2 - 7/8 *H, 0, P / 2],
[Dmaj / 2 - 7/8 *H, 0, P * 3 / 8], [Dmaj / 2, 0, 1 / 16 * H],
[Dmaj / 2, 0, 0]], [[0, 1, 2, 3, 4, 5]])
c += Mi([0,0,1])(c)
s = 0
for i in range(0, length//P):
s += Tz(i*P)(c)
return(s)
c = thread_sec(Dmaj, P, length)
# scad_render_to_file(c,"hull.scad")
c
该方案主要包括:
标准库data-metric_cyl_head_bolts.scad
函数库data-access.scad
主程序cyl_head_bolt.scad
还有材料模块等
我们先Py一下thread:
from solid import *
from solid.utils import *
import viewscad
r = viewscad.Renderer()
def thread(P=1, #螺距,
length=10, #螺丝的总长,
Rmaj=5, #外径,
sn = 36):
angle = 2 * pi/sn
Po = []
for i in range(0,sn):
j = i
if i > round(sn / 2):
j = sn - i
r = Rmaj - j / sn * P
p = [r * cos( i* angle), r * sin(i * angle)]
Po.append(p)
Fa = polygon(Po)
p3 = linear_extrude(height = length, convexity = 10, twist = -360.0*length/P, center = True)(Fa)
# print(scad_render(c))
# r.render(c)
# print(Pt)
return(p3)
c = thread()
c
c = Pr()(Ry(90)(c))#截面
c
上面这个结果( 这段代码费了小白一周时间,小白就是小白呀。。。),和ISO标准比较,从轮廓上并不完全一致,所以只能算是个伪标准螺纹库,接下来我们做个真正的标准螺纹
该方法来自OpenScad library. Threads for screws and nuts V1
当然了,我对原代码进行了优化并做了部分修改。
c = 0
for k in range(0,180+360//sn,360//sn):
c += Tz(k*P/360)(Rz(k)(P3([[0,0,P/2],[Rmaj - 7/8*H,0,P/2],[Rmaj,0,P/16],[Rmaj,0,-P/16], [Rmaj - 7/8*H,0,-P/2],[0,0,-P/2]], [[0,1,2,3,4,5]])))#用自己做的截面,
c = hull()(c)
c += R(0,180,180)(Ty(.001)(c))
s = 0
for v in range(0,length//P+1):
s += Tz(v*P)(c)
s += Cy(Rmaj-5/8*H, length)#内径
s *= Cy(2*Rmaj, length)
s
s = Pr()(Ry(90)(s))
s
hull很慢呀。。。看上去,还行。。。以上