在Python里应用Openscad实现3D建模之3D螺纹建模初探3

2023-10-28 22:40

本文主要是介绍在Python里应用Openscad实现3D建模之3D螺纹建模初探3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

–SolidPython学习笔记3

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

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

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

3D螺纹建模初探3

絮絮叨叨
  • 到目前我们已经分析了3D螺纹建模的2个解决方案:扭出来和糊出来(好恶俗的名字。。。)
  • 从以上的分析中我们应用PY代码初步实现了标准化的(符合ISO261)3D螺纹
  • 接下来我们探讨目前最为流行的方案,并进一步实现定制

方案三:垒出来 Solution Three: Sweep polyhedrons

  • 该方案是目前thingiverse上最为流行的方案包括:
    • NUT JOB | Nut, Bolt, Washer and Threaded Rod Factory by mike_mattala - Thingiverse
    • Poor man’s openscad screw library by aubenc - Thingiverse
    • Screw Library by syvwlch - Thingiverse
    • screw_thread.py
  • 该方案首先创建一个多面体,然后螺旋堆叠出来一个巨大的多面体
  • 这个方案不太好懂,以上几种方案中第一和第二个方案(较早)的螺纹建模(姑且叫衰人(Poorman)方案吧)是一样的,而Poorman的作者aubenc提到了更早的第3个方案
  • 以下就是
衰人方案:
scad代码:
module full_thread (ttn,//ttn=round(length/P)+1;圈数st, //Psn, //sn=floor(Dmaj*pi/fs);fs=pi/2  sengments  圆段数zt, // zt=P/fnIfxy, //angle_xy=360/fn;or, // Rmajir //Rmin)
{if(ir >= 0.2){for(i=[0:ttn-1]){for(j=[0:sn-1]){pt = [[0,0,i*st-st],[ir*cos(j*angle_xy),     ir*sin(j*angle_xy),     i*st+j*zt-st       ],[ir*cos((j+1)*angle_xy), ir*sin((j+1)*angle_xy), i*st+(j+1)*zt-st   ],[0,0,i*st],[or*cos(j*angle_xy),     or*sin(j*angle_xy),     i*st+j*zt-st/2     ],[or*cos((j+1)*angle_xy), or*sin((j+1)*angle_xy), i*st+(j+1)*zt-st/2 ],[ir*cos(j*angle_xy),     ir*sin(j*angle_xy),     i*st+j*zt          ],[ir*cos((j+1)*angle_xy), ir*sin((j+1)*angle_xy), i*st+(j+1)*zt      ],[0,0,i*st+st]];polyhedron(points=pt,faces=[[1,0,3],[1,3,6],[6,3,8],[1,6,4], //changed triangles to faces (to be deprecated)[0,1,2],[1,4,2],[2,4,5],[5,4,6],[5,6,7],[7,6,8],[7,8,3],[0,2,3],[3,2,7],[7,2,5]	]);}}}else{echo("Step Degrees too agresive, the thread will not be made!!");echo("Try to increase de value for the degrees and/or...");echo(" decrease the pitch value and/or...");echo(" increase the outer diameter value.");}
}
  • 我们看一下生成的螺纹的截面:

  • 可以看出仍是个伪标准螺纹,我们在下面的scad代码中修改一下
  • Or = Rmaj + 1 / 8 * H
  • 应用布尔运算修改
衰人方案ISO标准修订版之scad代码
use <shortcuts.scad>;
use<Nut_Job.scad>;
Dmaj = 10;
P = 1;
H = .866 * P;
$fn = 36;
length = 10;
Rmaj = Dmaj / 2;
Rmin = Dmaj / 2 - 5 / 8 * H;
Od = Dmaj+H/4
projection(){Ry(90)I(){U(){Tz(.5*length)Cy(r=Rmin, h=length);screw_thread(Od,1,30,10,PI*5/18,0);};Tz(.5*length)Cy(r=Rmaj, h=length);}
}

  • 当然了还有一种方法就是直接修改多面体参数(比如:Po,Fa)
衰人方案ISO标准修订版之python代码:
from solid import *
from solid.utils import *
import viewscadr = viewscad.Renderer(openscad_exec=r'/Applications/OpenSCAD.app/Contents/MacOS/OpenSCAD')
Dmaj = 10
P = 1
H = .866 * P
segments = 60
length = 10
Rmaj = Dmaj / 2
Rmin = Dmaj / 2 - 5 / 8 * H
def thread_p(Dmaj=10,P=1,length=10):angle_xy = 2 * pi / segmentszt = P / segmentsttn = round(length / P)p3 = 0c = []for i in range(0,ttn):for j in range(0,segments):Po = [  [                   0,                    0, i*P+ P                ],#中轴上#近截面[Rmin*cos( j   *angle_xy), Rmin*sin( j   *angle_xy), i*P+ 1/2  *P + j   *zt],[Rmin*cos( j   *angle_xy), Rmin*sin( j   *angle_xy), i*P+ 3/8  *P + j   *zt],[Rmaj*cos( j   *angle_xy), Rmaj*sin( j   *angle_xy), i*P+ 1/16 *P + j   *zt],[Rmaj*cos( j   *angle_xy), Rmaj*sin( j   *angle_xy), i*P- 1/16 *P + j   *zt],[Rmin*cos( j   *angle_xy), Rmin*sin( j   *angle_xy), i*P- 3/8  *P + j   *zt],[Rmin*cos( j   *angle_xy), Rmin*sin( j   *angle_xy), i*P- 1/2  *P + j   *zt],#远截面[Rmin*cos((j+1)*angle_xy), Rmin*sin((j+1)*angle_xy), i*P+ 1/2  *P +(j+1)*zt],[Rmin*cos((j+1)*angle_xy), Rmin*sin((j+1)*angle_xy), i*P+ 3/8  *P +(j+1)*zt],[Rmaj*cos((j+1)*angle_xy), Rmaj*sin((j+1)*angle_xy), i*P+ 1/16 *P +(j+1)*zt],[Rmaj*cos((j+1)*angle_xy), Rmaj*sin((j+1)*angle_xy), i*P- 1/16 *P +(j+1)*zt],[Rmin*cos((j+1)*angle_xy), Rmin*sin((j+1)*angle_xy), i*P- 3/8  *P +(j+1)*zt],[Rmin*cos((j+1)*angle_xy), Rmin*sin((j+1)*angle_xy), i*P- 1/2  *P +(j+1)*zt], [                   0,                    0, i*P- P                ]#中轴下]Fa =[   [0,1,2,3,4,5,6,13],[13,12,11,10,9,8,7,0],[7,1,0]           ,[13,6,12],[2,1,7,8]         ,[8,9,3,2],[4,3,9,10]        ,[5,4,10,11],[6,5,11,12]]if j == 0 and i == 0:p3 = bac(P3(Po, Fa))#1st P3# p3 += C("red")(Rx()(Le(.1)(Pr()(Rx(90)(P3(Po, Fa))))))# sector of 1st P3# c = 0for x in range(0,len(Po)):p3 += translate(Po[x]) (C("red")(Sp(.05)))#Pop3 += translate(Po[x]) (Le(.01)(text(text= str(x),size=.2))) #num of Poc += P3(Po, Fa)# c += Rx()(C("red")(Le(.1)(Rx()(c))))#run the projection() too slow    return p3, c
c = thread_p()[0]# scad_render_to_file(c, "thr_p.scad")
# r.render(c)
c

这是第一个修改后的多面体

c = thread_p()[1]
c

生成的螺纹

c = Pr()(Rx()(c))c

螺纹截面

这篇关于在Python里应用Openscad实现3D建模之3D螺纹建模初探3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296434

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#