伪民科小白不容易--一小段代码改了一周

伪民科小白不容易

– 一段代码改了一周

原始的代码来着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的范围,给定的终止数值并不在要生成的序列里;

记下来,以上。。。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jumbo Jing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值