在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2

在Python里应用Openscad实现3D建模(修改简化版)-3

–SolidPython学习笔记3

  • –form https://github.com/SolidCode/SolidPython

参考Parkinbotshortcuts.scad做了部分修改使得代码更为简洁易读

以下是对solidpython的readme的学习笔记(其中的部分code进行了简化):

3D螺纹建模初探2

絮絮叨叨

  • 在初探1中我们初步实现了螺纹的3D建模

  • 还通过fig动态演示了建模过程,代码有点啰嗦,还需要优化

  • 接下来,我们的任务是实现标准化定制,和非标准化定制

  • 先从标准化定制开始吧,首先学习基础知识

ISO261基础知识

–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>


术语

  • 公制ISO螺纹用字母M表示,后跟公称直径D的值(外螺纹的最大螺纹直径和内螺纹的最小直径)和螺距P,均以毫米表示,用连字符分隔标志, - (例如,M8-1.25)。如果螺距是ISO 261或ISO 262中列出的通常使用的“粗略”螺距,则可以省略它(例如,M8)。机器螺钉或螺栓的长度由以下x表示,长度以毫米表示(例如,M8-1.25×30或M8×30)。如果需要,ISO 965-1中定义的公差等级可以附加到这些名称(例如,外部线程中的M500-6g)。外部线程由小写字母g或h指定。内部线程由大写字母G或H指定。

标准截面

# 先做个截面
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

在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第1张图片

nutsnbolts 标准化解决方案

该方案主要包括:

  • 标准库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

在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第2张图片

c = Pr()(Ry(90)(c))#截面
c

在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第3张图片

上面这个结果( 这段代码费了小白一周时间,小白就是小白呀。。。),和ISO标准比较,从轮廓上并不完全一致,所以只能算是个伪标准螺纹库,接下来我们做个真正的标准螺纹

方案二:糊出来 Solution Two: Hull from sectors

该方法来自OpenScad library. Threads for screws and nuts V1

  • 首先做出一侧的纵截面
  • 移动及旋转出螺纹的轮廓
  • 利用hull()形成螺纹
  • 最后,延长复制出整个螺纹。

当然了,我对原代码进行了优化并做了部分修改。

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


在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第4张图片


s = Pr()(Ry(90)(s))
s

在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第5张图片

hull很慢呀。。。看上去,还行。。。以上

在Python里应用Openscad实现3D建模(修改简化版)之3D螺纹建模初探2_第6张图片

你可能感兴趣的:(Python,openscad,3D打印)