伪民科小白不容易
– 一段代码改了一周
原始的代码来着cyl_head_bolt.scad
这是原始代码:
module thread(
// the thread is extruded with a twisted linear extrusion
orad=10, // outer diameter of thread
tl=10, // thread length
p=1) // lead of thread
{ // -----------------------------------------------
// radius' for the spiral
r = [orad-0/18*p, orad-1/18*p, orad-2/18*p, orad-3/18*p, orad-4/18*p, orad-5/18*p,
orad-6/18*p, orad-7/18*p, orad-8/18*p, orad-9/18*p, orad-10/18*p, orad-11/18*p,
orad-12/18*p, orad-13/18*p, orad-14/18*p, orad-15/18*p, orad-16/18*p, orad-17/18*p,
orad-p];
// extrude 2d shape with twist
translate([0,0,tl/2])
//difference() {
linear_extrude(height = tl, convexity = 10, twist = -360.0*tl/p, center = true)
// mirrored spiral (2d poly) -> triangular thread when extruded
polygon([[ r[ 0]*cos( 0), r[ 0]*sin( 0)], [r[ 1]*cos( 10), r[ 1]*sin( 10)],
[ r[ 2]*cos( 20), r[ 2]*sin( 20)], [r[ 3]*cos( 30), r[ 3]*sin( 30)],
[ r[ 4]*cos( 40), r[ 4]*sin( 40)], [r[ 5]*cos( 50), r[ 5]*sin( 50)],
[ r[ 6]*cos( 60), r[ 6]*sin( 60)], [r[ 7]*cos( 70), r[ 7]*sin( 70)],
[ r[ 8]*cos( 80), r[ 8]*sin( 80)], [r[ 9]*cos( 90), r[ 9]*sin( 90)],
[ r[10]*cos(100), r[10]*sin(100)], [r[11]*cos(110), r[11]*sin(110)],
[ r[12]*cos(120), r[12]*sin(120)], [r[13]*cos(130), r[13]*sin(130)],
[ r[14]*cos(140), r[14]*sin(140)], [r[15]*cos(150), r[15]*sin(150)],
[ r[16]*cos(160), r[16]*sin(160)], [r[17]*cos(170), r[17]*sin(170)],
[ r[18]*cos(180), r[18]*sin(180)], [r[17]*cos(190), r[17]*sin(190)],
[ r[16]*cos(200), r[16]*sin(200)], [r[15]*cos(210), r[15]*sin(210)],
[ r[14]*cos(220), r[14]*sin(220)], [r[13]*cos(230), r[13]*sin(230)],
[ r[12]*cos(240), r[12]*sin(240)], [r[11]*cos(250), r[11]*sin(250)],
[ r[10]*cos(260), r[10]*sin(260)], [r[ 9]*cos(270), r[ 9]*sin(270)],
[ r[ 8]*cos(280), r[ 8]*sin(280)], [r[ 7]*cos(290), r[ 7]*sin(290)],
[ r[ 6]*cos(300), r[ 6]*sin(300)], [r[ 5]*cos(310), r[ 5]*sin(310)],
[ r[ 4]*cos(320), r[ 4]*sin(320)], [r[ 3]*cos(330), r[ 3]*sin(330)],
[ r[ 2]*cos(340), r[ 2]*sin(340)], [r[ 1]*cos(350), r[ 1]*sin(350)]
]);
}
// -----------------------------
thread();
运行的结果是:
最开始用Py代码优化如下:
def thread(P=1, #螺距,
length=2, #螺丝的总长,
Rmaj=5, #外径,
sn = 36):
angle = 360/sn
Pt = []
for i in range(sn):
if i > round(sn / 2):
i = i - round(sn / 2)
r = Rmaj - i / sn * P
p = [r * cos( i* angle), r * sin(i * angle)]
Pt.append(p)
c = P2(Pt)
c = Le(height = length, convexity = 10, twist = -360.0*length/P,
center = True, slices = 500)(c)
return(c)
成功了吗?
于是想用截面来验证一下:
c = Pr()(Ry(90)(thread()))
c
等了好久没有结果
转化成scad文件看看
c = Pr()(Ry(90)(thread()))
scad_render_to_file(c,"testcc.scad")
得到了这个文件:
projection() {
rotate(a = [0, 90, 0]) {
linear_extrude(center = true, convexity = 10, height = 2, slices = 500, twist = -720.0000000000) {
polygon(paths = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]], points = [[5.0000000000, 0.0000000000], [-4.1720501029, -2.7049938569], [2.0177390834, 4.5140070730], [0.7584029619, -4.8578221518], [-3.2605860792, 3.6427754512], [4.6908070829, -1.2754333166], [-4.6033294053, -1.4732513353], [3.0434506148, 3.7189746642], [-0.5274057206, -4.7485791243], [-2.1283496766, 4.2464841521], [4.0720613414, -2.3911710830], [-4.6898477069, -0.2076947943], [3.7995111958, 2.7095188597], [-1.7038236718, -4.3146581578], [-0.9121403690, 4.5199939852], [3.2048995297, -3.2765169691], [-4.4445335361, 0.9996039548], [4.2470317943, 1.5695517013], [-2.6930703108, -3.6051868608], [-4.1720501029, -2.7049938569], [2.0177390834, 4.5140070730], [0.7584029619, -4.8578221518], [-3.2605860792, 3.6427754512], [4.6908070829, -1.2754333166], [-4.6033294053, -1.4732513353], [3.0434506148, 3.7189746642], [-0.5274057206, -4.7485791243], [-2.1283496766, 4.2464841521], [4.0720613414, -2.3911710830], [-4.6898477069, -0.2076947943], [3.7995111958, 2.7095188597], [-1.7038236718, -4.3146581578], [-0.9121403690, 4.5199939852], [3.2048995297, -3.2765169691], [-4.4445335361, 0.9996039548], [4.2470317943, 1.5695517013]]);
}
}
}
还是打不开,电脑不给力吗?用MacBook Pro试了一下还是不成功!!!
开始想到去网上问问:
Try open this file, preview or render failed, what’s wrong??
没有结果。。。
再问!
Try open this file, preview or render failed, what’s wrong??
好吧!终于找到原因了,原来在py中计算三角函数是不能用角度–和openscad不一样–只能用弧度。
修改后得到如下结果:
好逊,还是不对呀。。。
还有问题。。。似乎是这段代码
这么改一下:
def thread(P=1, #螺距,
length=2, #螺丝的总长,
Rmaj=5, #外径,
sn = 36):
angle = 2 * pi/sn
Pt = []
for i in range(0,sn-1):
if i > round(sn / 2):
i = sn - i
r = Rmaj - i / sn * P
p = [r * cos( i* angle), r * sin(i * angle)]
Pt.append(p)
c = P2(Pt)
c = Le(height = length, convexity = 10, twist = -360.0*length/P,
center = True, slices = 500)(c)
# print(scad_render(c))
# r.render(c)
# print(Pt)
return(c)
结果:
好奇怪呀?哪里出错了呢?
把scad原始代码py化:
def thread(
# the thread is extruded with a twisted linear extrusion
Dmaj, # outer diameter of thread
length, # thread length
P): # lead of thread
# radius’ for the spiral
r = [Dmaj-0/18*P, Dmaj-1/18*P, Dmaj-2/18*P, Dmaj-3/18*P, Dmaj-4/18*P, Dmaj-5/18*P,
Dmaj-6/18*P, Dmaj-7/18*P, Dmaj-8/18*P, Dmaj-9/18*P, Dmaj-10/18*P, Dmaj-11/18*P,
Dmaj-12/18*P, Dmaj-13/18*P, Dmaj-14/18*P, Dmaj-15/18*P, Dmaj-16/18*P, Dmaj-17/18*P,
Dmaj-P]
# extrude 2d shape with twist
# translate([0,0,length/2])
#difference() {
c = linear_extrude(height = length, convexity = 10, twist = -360.0*length/P, center = True)(
# mirrored spiral (2d poly) -> triangular thread when extruded
polygon([[ r[ 0]*cos( 0/36*2*pi), r[ 0]*sin( 0/36*2*pi)], [r[ 1]*cos( 1/36*2*pi), r[ 1]*sin( 1/36*2*pi)],
[ r[ 2]*cos( 2/36*2*pi), r[ 2]*sin( 2/36*2*pi)], [r[ 3]*cos( 3/36*2*pi), r[ 3]*sin( 3/36*2*pi)],
[ r[ 4]*cos( 4/36*2*pi), r[ 4]*sin( 4/36*2*pi)], [r[ 5]*cos( 5/36*2*pi), r[ 5]*sin( 5/36*2*pi)],
[ r[ 6]*cos( 6/36*2*pi), r[ 6]*sin( 6/36*2*pi)], [r[ 7]*cos( 7/36*2*pi), r[ 7]*sin( 7/36*2*pi)],
[ r[ 8]*cos( 8/36*2*pi), r[ 8]*sin( 8/36*2*pi)], [r[ 9]*cos( 9/36*2*pi), r[ 9]*sin( 9/36*2*pi)],
[ r[10]*cos(10/36*2*pi), r[10]*sin(10/36*2*pi)], [r[11]*cos(11/36*2*pi), r[11]*sin(11/36*2*pi)],
[ r[12]*cos(12/36*2*pi), r[12]*sin(12/36*2*pi)], [r[13]*cos(13/36*2*pi), r[13]*sin(13/36*2*pi)],
[ r[14]*cos(14/36*2*pi), r[14]*sin(14/36*2*pi)], [r[15]*cos(15/36*2*pi), r[15]*sin(15/36*2*pi)],
[ r[16]*cos(16/36*2*pi), r[16]*sin(16/36*2*pi)], [r[17]*cos(17/36*2*pi), r[17]*sin(17/36*2*pi)],
[ r[18]*cos(18/36*2*pi), r[18]*sin(18/36*2*pi)], [r[17]*cos(19/36*2*pi), r[17]*sin(19/36*2*pi)],
[ r[16]*cos(20/36*2*pi), r[16]*sin(20/36*2*pi)], [r[15]*cos(21/36*2*pi), r[15]*sin(21/36*2*pi)],
[ r[14]*cos(22/36*2*pi), r[14]*sin(22/36*2*pi)], [r[13]*cos(23/36*2*pi), r[13]*sin(23/36*2*pi)],
[ r[12]*cos(24/36*2*pi), r[12]*sin(24/36*2*pi)], [r[11]*cos(25/36*2*pi), r[11]*sin(25/36*2*pi)],
[ r[10]*cos(26/36*2*pi), r[10]*sin(26/36*2*pi)], [r[ 9]*cos(27/36*2*pi), r[ 9]*sin(27/36*2*pi)],
[ r[ 8]*cos(28/36*2*pi), r[ 8]*sin(28/36*2*pi)], [r[ 7]*cos(29/36*2*pi), r[ 7]*sin(29/36*2*pi)],
[ r[ 6]*cos(30/36*2*pi), r[ 6]*sin(30/36*2*pi)], [r[ 5]*cos(31/36*2*pi), r[ 5]*sin(31/36*2*pi)],
[ r[ 4]*cos(32/36*2*pi), r[ 4]*sin(32/36*2*pi)], [r[ 3]*cos(33/36*2*pi), r[ 3]*sin(33/36*2*pi)],
[ r[ 2]*cos(34/36*2*pi), r[ 2]*sin(34/36*2*pi)], [r[ 1]*cos(35/36*2*pi), r[ 1]*sin(35/36*2*pi)]])
)
return(c)
还好:
请教了高手
终于解决:
def thread(P=1, #螺距,
length=10, #螺丝的总长,
Rmaj=10, #外径,
sn = 36):
angle = 2 * pi/sn
Pt = []
for i in range(0,sn-1):
j = i #新增变量,防止流程改变
if i > round(sn / 2):
j = sn - i
r = Rmaj - j / sn * P * 2
p = [r * cos( i* angle), r * sin(i * angle)]
Pt.append(p)
# c = P2(Pt)
c = linear_extrude(height = length, convexity = 10, twist = -360.0*length/P, center = True)(P2(Pt))
# print(scad_render(c))
# r.render(c)
print(Pt)
return(c)
c = thread()
c
总结一下:
- 在py中三角函数要用弧度
- 在py中for循环时注意,作为控制流程的变量i,从始至终要流畅,对于有可能改变流程的过程中,再加入一个(我称之为)执行变量j,是个聪明的办法;
- 注意:range的范围,给定的终止数值并不在要生成的序列里;
记下来,以上。。。