醛酮的化学反应

playscene 1~5
复制代码
        def playscene1():
#             config.disable_caching=True
            exm('a',8);xos(1.5,a1,a2,a3);x1=msmc('nu');x2=msmc('h2o');x3=msmc('oh');xcs(a1,x1,x2,x3);a4.set_opacity(1)
            ext({1:'羰基是醛、酮类化合物的反应中心',2:'由于氧原子的电负性比碳原子大,故碳带有正电性',3:'正电性的碳容易被亲核试剂进攻,发生亲核加成反应',4:'亲核加成反应可以在碱性条件下进行,机理如下:'})
            exn({1:'亲核试剂进攻羰基碳', 2:'质子化'})
            sig1=mmt(r'\delta +').next_to(a1[0],0.5*r);sig2=mmt(r'\delta -').next_to(a1[1],0.5*r);title=Text('醛和酮的化学反应',font='STZhongsong')
            tf1=xtf('亲核加成');tf2=xtf2(1,'碱性机理').next_to(tf1,r)
            sh(sig1,0.2*u,x1,2*d,x2,4*r,x3,4*r);c(sig1,rr,sig2,bb,t2[-3:],rr,t3[0:3],rr,a2[7],bb,a2[3],rr)
            sc(x1,1.6)
            

            xxp(adb(title),afo(title),[afi(t1),bfi(a1)],w(0),[at(t1,t2),*ac(a1[0],rr,a1[1],bb,a1[2:4],[bb,rr])],[agf(sig1),agf(sig2)],w(0),at(t2,t3),[ash(mvg(a1,sig1,sig2),u),afi(x1,shift=UP)])
            xxp((ash(x1,1.5*u,rate_func=rate_functions.rush_into),ash(x1,1.5*d,rate_func=rate_functions.rush_from)),adb(tf1),[at(t3,t4),adb(tf2),ast(sig1),ast(sig2),*ac(a1[0:3],ww,a1[3],bb),*ac(x1[1],rr)],w(0),at(t4,n1),xt([a1,x1,a2],[0,2,[1,1,2,4,3,7,0,0,4,5,5,6]],[1,2,[0,2,1,3]]))
            xxp(ac(a2,ww),agf(x2),at(n1,n2),xt([a2,x2,a3,x3],[0,2,[1,1,4,5,0,0,5,6,6,7,3,4,2,3]],[1,2,[0,2]],[1,3,[2,0,1,1]]),w(0),[at(mvg(a3,x3),a4),afo(n2)])
        def playscene2():
            ext({1:'按碱性反应机理完成的反应有:'})
            exm('a',8);xos(1,a4,a5,a6,a7,a8)
            tf1=xtf('亲核加成');tf2=xtf2('碱性机理').next_to(tf1,r)
            f1=xtf3('HCN');f2=xtf3('炔化物');f3=xtf3('有机金属化合物');f4=xtf3('NaHSO<sub>3</sub>',judge=2);brace1=BraceBetweenPoints([-1.3,1.8,0],[-1.3,-0.8,0]);brace2=BraceBetweenPoints([-1.3,-1.2,0],[-1.3,-1.8,0])
            xmc(f1,0,[-4,1,0]);xmc(f2,0,[2,1,0]);xmc(f3,0,[-4,-1,0]);xmc(f4,0,[2,-1,0]);x1=xn2('含碳亲核试剂').next_to(brace1,1.5*l);x2=xn2('含硫亲核试剂').next_to(brace2,1.5*l)
            f01=f1[0].copy().move_to(ORIGIN).shift(0.6*l);f02=f01.copy();f03=f01.copy();f04=f01.copy();pref=xtf3('').next_to(tf2,r)
            
            
            sa(tf1,tf2,a4);xxp(w(0),[bfo(a4),afi(t1)],agf(f01));sa(f02,f03,f04);xxp(xal(0.1,aro(f02,ORIGIN,angle=-PI/2),aro(f03,ORIGIN,angle=-PI),aro(f04,ORIGIN,angle=-3*PI/2)),[at(f01,f1[0]),at(f02,f2[0]),at(f03,f3[0]),at(f04,f4[0])])
            xxp([bfi(f1[1]),bfi(f2[1]),bfi(f3[1]),bfi(f4[1])],[ash(f1,ygd(f1[0],[-1,1.5,0])),ash(f2,ygd(f2[0],[-1,0.5,0])),ash(f3,ygd(f3[0],[-1,-0.5,0])),ash(f4,ygd(f4[0],[-1,-1.5,0]))])
            xxp([adb(brace1),adb(brace2)],[agf(x1),agf(x2)],w(),[afo(t1),ast(mvg(brace1,brace2,x1,x2)),ast(f2[1]),ast(f3[1]),ast(f4[1]),ash(f4[0],ygd(f4[0],pref)),ash(f3[0],ygd(f3[0],list(pref.get_center() - [0,0.2,0]))),ash(f2[0],ygd(f2[0],list(pref.get_center() - [0,0.4,0]))),ash(f1,ygd(f1[0],list(pref.get_center() - [0,0.6,0])))])
        def playscene3():
            bub = yib(3)
            ext({1:'为什么HCN按碱性反应机理进行反应呢?',2:'由于HCN是弱酸,加入碱后可以增加CN-的浓度',3:'亲核加成速率也随之增加'})
            exn({1:'阳离子与带负电的氧结合',2:'水解生成醇',3:'由于硫的强亲核性,反应不需加酸催化'})
            a7b=msm('a7_b')
            exm('a',8);xos(1,a4,a5,a6,a7,a7b,a8);ytt(t2[19])
            tf1=xtf('亲核加成');tf2=xtf2('碱性机理').next_to(tf1,r);f1=xtf3('HCN');f2=xtf3('炔化物');f3=xtf3('有机金属化合物');f4=xtf3('NaHSO<sub>3</sub>',judge=2).next_to(tf2,r)
            mvg(f2[1],f3[1],f4[1]).set_opacity(0);f3.shift(ygd(f3[0],list(f4[0].get_center() - [0,0.2,0])));f2.shift(ygd(f2[0],list(f3[0].get_center() - [0,0.2,0])));f1.shift(ygd(f1[0],list(f2[0].get_center() - [0,0.2,0])))
            a6.move_to(ORIGIN);a7.move_to(ORIGIN);a7b.move_to(ORIGIN);a8.move_to(ORIGIN);sc(a6,0.9,a8,0.9)
            n1.next_to(a7[4],u);n2.next_to(a7[11],3.5*d);a50=a5.copy()
            
            sa(tf1,tf2,f1,f2,f3,f4);xxp(bfi(a4),xt2(a4,a5,[2,20,7,6,6,5,21,21,16,15]),(a5,tf1,tf2,f1,f2,f3,f4),afi(t1),w(0),[ast(a5),agf(bub[0]),at(t1,t2)],at(bub[0],bub[1]))
            xxp([ast(bub[1][1:]),agf(a50[0:20]),agf(a50[21]),bub[1][0].animate.set_height(1.3).move_to(a50[20].get_center() + 0.2*l)],at(t2,t3),at(bub[1][0],a50[20]),afo(t3))
            xxp(xt([a50,a6],[0,1,[0,0,1,1,20,12,2,2,4,4,7,8,3,3,8,9,9,10,6,7,5,13,21,22,11,11,13,15,14,16,17,18,12,14,18,19,19,20,16,17,15,21]]),[afoo(f1),f2[1].animate.set_opacity(1)],w(1))
            xxp(xt([a6,a7],[0,1,[0,0,1,1,12,20,2,2,4,4,'5.7',5,8,8,3,3,9,9,10,10,7,7,13,6,22,21,11,11,15,13,16,14,18,17,14,12,19,18,20,19,17,16,21,15]]),[afoo(f2),f3[1].animate.set_opacity(1)],afii(n1),[*ac(n1[0:3],rr,a7[5],rr)])
            xxp([afo(n1),*ac(a7[5],ww)],afi(n2,shift=u),w(0),afo(n2),xt([a7,a7b],[0,1,[0,0,1,1,20,21,22,20,2,3,4,4,5,22,8,7,3,2,9,8,10,9,7,6,6,5,21,19,11,10,13,12,14,13,17,16,12,11,18,17,19,18,16,15,15,14]]),w(1))
            xxp(xt([a7b,a8],[0,1,[0,0,1,1,21,21,3,2,4,4,22,5,7,8,2,3,8,9,9,10,6,7,5,6,19,20,10,11,12,13,13,14,16,17,11,12,17,18,18,19,15,16,14,15]]),[afoo(f3),f4[1].animate.set_opacity(1)],afi(n3),w(0),afo(n3))
            xxp(afo(a8,f4))
        def playscene4():
            oen({1:'亲核加成反应也可以在酸性条件下进行,机理如下:',2:'按酸性反应机理完成的反应有:'})
            oen2({1:'质子化后可以增加羰基的亲电性能',2:'亲核试剂进攻羰基碳'})
            oem('b',19);
            oeo('o',{1:otf('亲核加成'),2:otf2('碱性机理'),3:otf2('酸性机理'),4:otf3('氨或胺'),5:otf3('氨衍生物'),6:otf3('H<sub>2</sub>O',judge=2),7:otf3('')})
            oeo('v',{1:upg(4,2,[o4,o5],[o6,o7])})
            oeo('x',{1:msmc('h'),2:msmc('nu')})
            uos(1.8,b1,b2,b3);uos(1.5,b4,b5)
            ufsc(x1,0.4,x2,0.35)
            ufsh(x1,4*r,x2,4*r)
            ufnt(o2,o1,r,o3,o1,r)
            ufc(mvg(b2[0:2],b2[3:5]),rr,n1[8:10],rr,x2[1],bb,b3[5],bb)
            
            z0 = upl0(0.2,*v1,dire=u,co=1)
            z = upnt0(z0,3,o3,1,r,co=1)
            ufo(mvg(z[3][1],z[2][1],z[1][1]),0)
            sa(o1,o2);cxp(adbr(o2),[adb(o3),afi(t1)],[cfi(b1,x1)],[ct([b1,x1,b2],[0,2,[1,1,2,3,3,4,0,0,4,5,5,6]],[1,2,[0,2,1,7]]),at(t1,n1)],cw(0),ac(mvg(b2[0:2],b2[3:5]),ww),agf(x2))
            cxp([ct([b2,x2,b3],[0,2,[1,1,2,2,3,3,0,0,5,6,6,7]],[1,2,[0,4,1,5]]),at(n1,n2)],cw(0),[afo(n2),at(b3,b4)],cw(0),[afi(t2),afo(b4)],cfc(*v1),upl0(1,*v1))
            oeo('o',{8:mbbm(v1[0][0],v1[1][0],0.5*l,rise=0.8),9:mbbm(v1[2][0],v1[3][0],0.5*l,rise=0.8)})
            oen2({3:'含氮亲核试剂',4:'含氧亲核试剂'})
            ufnt(n3,o8,l,n4,o9,l)
            cxp(adb(o8,o9),agf(n3,n4),cw(0.5),ast(n3,n4,o8,o9),[at0(v1,z),afo(t2)])
        def playscene5():
            oen({1:'一级胺反应的机理如下:',2:'以上各步均为可逆反应',3:'二级胺的反应机理与一级胺类似',4:'此时氮上没有质子可以失去,需要从α-C上脱去质子,结果生成烯胺'})
            oen2({1:'质子发生转移,羟基离去',2:'脱去质子'})
            oeo('o',{1:otf('亲核加成'),2:otf2('酸性机理'),3:otf3('氨或胺'),4:otf3('氨衍生物'),5:otf3('H<sub>2</sub>O',judge=2),6:otf3('')});ufo(mvg(o4[1],o5[1],o6[1]),0)
            oeo('v',{1:upl(0.2,o3,o4,o5,o6,dire=u)});oem('b',19);uos(1.5,b4,b5);uos(1.8,b6,b7,b8,b9,b10,b11,b12,b13);uos(1,b14,b15)
            oeo('x',{1:msmc('h2o'),2:msmc('h'),3:msmc('h')})
            ufsc(x1,0.4,x2,0.4,x3,0.4,b5,0.9);b5.move_to(ORIGIN)
            ufsh(x1,4*r,x2,4*r,x3,4.5*r)
            ufnt(o2,o1,r);ufc(b7[1:4],bb,b8[1:4],bb,x1,bb,b12[13],rr,b13[2],rr,n1[7:9],bb)
            upnt(v1,3,o2,1,r)
            
            
            sa(o1,o2,v1)
            cxp(cfi(b4),[ct([b4,b5],[0,1,[2,0,4,2,3,1,1,3,0,4]]),afi(t1)],cw(0),[at(b5[3:5],b6),afo(b5[0:3])],at(t1,n1),ct([b6,b7],[0,1,[1,1,2,2,3,4,0,0,9,9,10,10,8,8,4,5,5,6,6,3,7,7]]),ct([b7,b9,x1],[0,1,[0,0,9,4,10,5,8,2,5,1,6,6,7,8]],[0,2,[1,2,2,0,3,1]]))
            cxp(afo(x1),at(n1,n2),ct([b9,b10,x2],[0,1,[4,5,5,6,0,0,2,3,3,4,1,1,8,2]],[0,2,[6,0]]),at(n2,t2),cw(0),at(t2,t3),ctr([b9,b10,x2],[0,1,[4,5,5,6,0,0,2,3,3,4,1,1,8,2]],[0,2,[6,0]]),ct([b9,b11],[0,1,[4,4,0,0,5,5,2,2,3,3,1,1,10,10,9,9,8,8,7,7,6,6]]))
            cxp(at(t3,t4),cw(1),ct([b11,b12],[0,1,[4,8,0,0,5,9,2,4,3,5,10,6,1,1,6,2,8,3]]),ct([b12,b13,x3],[0,1,[10,4,11,5,13,2,7,0,8,3,0,1,9,6,5,10,1,7,2,8,3,9]],[0,2,[12,0]]),afo(x3,t4),[afoo(b13),afii(b14)])
View Code
复制代码

 playscene 6~10

复制代码
        def playscene6():
            oeo('o',{1:otf('亲核加成'),2:otf2('酸性机理'),3:otf3('氨或胺'),4:otf3('氨衍生物'),5:otf3('H<sub>2</sub>O',judge=2),6:otf3('')});ufo(mvg(o4[1],o5[1],o6[1]),0)
            oeo('v',{1:upl(0.2,o3,o4,o5,o6,dire=u)});oem('b',19);uos(1,b14,b15,b16,b17,b18,b19);oem('c',3);uos(1.5,c1,c2)
            oeo('m',{1:'',2:'',3:'苯腙',4:'半卡巴腙'})
            oen({1:'氨中的氢被其他基团取代后的化合物称为氨的衍生物',2:'氨的衍生物也会发生类似的反应'})
            ufsc(b16,0.9,b17,0.9,b18,0.8,b19,0.8)
            ufmt(b16,ORIGIN,b17,ORIGIN,b18,ORIGIN,b19,ORIGIN)
            ufnt(m1,b16[3:5],d,m2,b17[3:5],d,m3,b18[3:5],d,m4,b19[3:5],d,o2,o1,r)
            ufc(mvg(m1,m2,m3,m4,b16[1:5],b15[1:3],b17[1:5],b18[1:5],b19[1:5],t1[18:],t2[0:5]),gg)
            upnt(v1,3,o2,1,r)
            

            sa(o1,o2,v1,b14);
            cxp(afi(t1),ct([b14,b15],[0,1,[0,0,1,2,2,1,3,3,4,4,5,5]]),[afoo(o3),aso(o4[1],1)],at(t1,t2),cw(0),afo(t2),at(b15,b16),agf(m1),at(b16,b17),[afoo(m1),agf(m2)],cw(0),at(b17,b18),[afoo(m2),agf(m3)],cw(0),ct([b18,b19],[0,1,[0,0,1,1,2,2,3,4,4,3,5,5]]),[afoo(m3),agf(m4)],cw(0))    
            cxp([afoo(b19,m4),afii(c1)],[afoo(o4),aso(o5[1],1)])
        def playscene7():
            oen2({1:'醛或酮的水合物很不稳定,容易失水重新变为醛或酮',2:'失去质子',3:'半缩醛(酮)很不稳定,羟基易接受质子后离去',4:'随后再次发生加成',5:'失去质子'})
            oem('c',8);uos(1.5,c1,c2);uos(2,c3,c4,c5,c6,c7,c8)
            oeo('o',{1:otf('亲核加成'),2:otf2('酸性机理'),3:otf3('H<sub>2</sub>O',judge=2),4:otf3(''),5:c1.copy(),6:'半缩醛(酮)',7:'缩醛(酮)'});ufo(mvg(o4[1]),0)
            oeo('v',{1:upl(0.2,o3,o4,dire=u)});oem('b',19);c1.save_state()
            oeo('x',{1:msmc('h'),2:msmc('h2o')})
            ufnt(o2,o1,r,o6,c3,d,o7,c8,d)
            upnt(v1,1,o2,1,r)
            ufc(c4[11],bb,c5[3],bb,mvg(c6[3],c7[4]),bb,mvg(o6,o7),rr)
            ufsh(c6,4*r)
            
#             uc([c5,c6,c7])
            sa(c1,o1,o2,v1);
            cxp(afi(n1),cw(0),aso(c1[0:20],0.5),[ct3(c1,o5,[20,0,27,4,28,5,23,2,21,1]),ast(c1[24:27],c1[22]),agf(o5[3])],[are(c1),ast(o5[3])],[at(c1[0:26],c2[0:26]),afo(n1),ct3(c1,c2,[26,27,27,28,28,29]),agf(c2[26],c2[30])],(o1,o2,v1,c2))
            cxp([afoo(o3),aso(o4[1],1)],[ct([c2,c3,x1],[0,1,[21,1,22,2,23,3,20,0,28,7,29,8,27,6,24,4,26,5]],[0,2,[25,0,30,1]]),afi(n2)],[agf(o6),afo(x1),afo(n2)],afi(n3),agf(x1),[ct([c3,x1,c4],[0,2,[1,1,2,2,3,4,0,0,7,8,8,9,6,7,4,5,5,6]],[1,2,[0,3,1,10]]),ast(o6)])
            cxp(ct([c4,c5,x2],[0,1,[8,5,9,6,0,0,7,4,11,3,5,1,6,2]],[0,2,[2,0,1,2,3,1]]),ac(c5[3],ww),[at(n3,n4),afo(x2)],agf(c6),ct([c5,c6,c7],[0,2,[5,8,6,9,0,0,4,7,1,5,2,6]],[1,2,[0,3,1,1,2,2,3,4]]),at(n4,n5),ct([c7,c8,x1],[0,1,[1,1,3,2,4,3,0,0,8,7,9,8,7,6,5,4,6,5]],[0,2,[2,0,10,1]]))
            cxp(agf(o7),cw(0),[afo(x1,c8,n5,o7),afoo(o4)],[adbr(o1),adbr(o2)])
        def playscene8():
            oen({1:'醛酮的 α-H 很活泼,原因是羰基的吸电子诱导效应使氢容易离去',2:'且产生的碳负离子可以与羰基形成共轭,结构稳定',3:'醛酮的 α-H 可以被卤素取代',4:'酸催化下的卤代反应机理如下:',
                5:'酸催化反应中,质子化酮生成烯醇是决速步骤',6:'当 α-C 引入一个卤原子后,由于卤原子的吸电子作用',7:'氧原子减弱了接受质子的能力',8:'故烯醇化的速度减慢,导致继续卤代的速度减慢',9:'反应可以控制在一卤代物阶段'})
            oen2({1:'共振',2:'失去质子',3:'失去质子'})
            oem('d',17);uos(2,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17);d2.set_sheen_direction=l
            oeo('o',{1:otf('α-H 的卤化'),2:otf2('酸性机理')})
            oeo('x',{1:msmc('h')})
            ufc(mvg(t1[3:6],d1[5],d2[6],d8[2],d12[6]),rr,mvg(d7[6],d8[2],d10[2],d11[1]),bb)
            ufsc(d14,0.8)
            ufmt(d14,o)
            ufsh(d9,4*r,d10,4*r,d11,4*r)
            ufnt(o2,o1,r)
            
            cxp([cfi(d1),afi(t1)],cw(0),ct([d1,d2],[0,1,[8,0,9,3,10,2,0,1,3,5,2,4,6,7,5,6]]),ac(d2,[ww,bb],t1[3:6],ww),ct([d2,d3,x1],[0,1,[0,0,2,2,3,3,1,1,5,5,4,4,7,6]],[0,2,[6,0]]),[afo(x1),at(t1,t2)])
            cxp(ac(d3[6],tt,d3[2],gg),ct([d3,d4],[0,1,[0,6,2,'0.4',3,8,1,7,5,10,4,9,6,'4.6']]),amt(d4,o),[afoo(d4),afii(d5),at(t2,t3)],adb(o1),at(t3,t4),adb(o2),agf(x1),ct([d5,x1,d6],[0,2,['0.9','0.9',9,10,10,11]],[1,2,[0,9,1,12]]))
            cxp(at(t4,n1),ct([d6,d7],[0,1,[1,1,0,0,8,8,9,9,11,11,3,3,2,2,4,4,5,5,6,6,7,7]]),at(n1,n2),ct([d7,d8,x1],[0,1,[1,9,11,8,8,7,9,6,0,0,3,3,6,2,2,1,4,4,7,5]],[0,2,[5,0]]),[afo(n2,x1),ac(d8[2],ww)],agf(d9))
            cxp([ct([d9,d10],[0,1,[0,0,1,1]]),ac(d8[2],rr)],ct([d8,d10,d12,d11],[0,2,[6,8,7,9,8,11,0,0,9,1,3,3,2,6,1,2,4,4,5,7]],[1,2,[0,5]],[1,3,[1,0,2,1]]),afo(d11),[ct([d12,d13,x1],[0,1,['0.9','0.9',10,9,11,10]],[0,2,[9,0,12,1]]),afi(n3)],cw(0))
            cxp([afoo(d13,x1),afii(d14),at(n3,t5)],cw(1),[ct([d14,d15],[0,1,[1,1,0,0,8,9,9,10,10,11,3,3,2,2,5,6,6,7,4,5,7,8]]),at(t5,t6)],ac(d15[10:12],[bb,ww],d15[9],bb,d15[4],gg,t6[8:11],gg,t6[15:18],gg),cw(0),at(t6,t7),ct([d15,d16],[0,1,['0.10','0.10',10,11,11,12]]),at(t7,t8),cw(1),at(t8,t9),ac(t9[7:11],gg,d16[4],gg),afo(d16,t9),adbr(o2))
        def playscene9():
            oen({1:'碱催化下的卤代反应机理如下:',2:'碱催化反应中,碱从酮夺取质子生成烯醇负离子是决速步骤',3:'当 α-C 引入一个卤原子后,由于卤原子的吸电子作用',4:'α-H 酸性增强,更容易被夺取,继续卤代的速度加快',5:'最终 α-C 上的氢全部被卤素取代'})
            oen2({1:'碱夺取质子',2:'共振'})
            oeo('o',{1:otf('α-H 的卤化'),2:otf2('碱性机理')})
            oem('e',11);uos(2,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11)
            oeo('x',{1:msmc('oh'),2:msmc('h2o')})
            
            ufsc(x1,0.7,e8,0.7)
            ufsh(x1,r,x2,r,mvg(e5,e6,e7),5*r)
            ufnt(o2,o1,r)
            ufmt(e8,o)
            ufc(t3[15:18],gg,t3[8:11],gg)
            

#             uc([e10,e11])
            sa(o1);cxp([afi(t1),adb(o2),agf(e1)],agf(x1),[ct([e1,x1,e2,x2],[0,2,[8,6,9,7,10,8,1,1,0,0,3,3,2,2,4,4,7,5,6,9]],[0,3,[5,1]],[1,3,[0,2,1,0]]),at(t1,n1)],afo(x2),[at(n1,n2),ct([e2,e3],[0,1,[1,6,0,0,6,4,7,5,8,9,3,3,9,2,2,1,4,7,5,8]])])
            cxp(afo(n2),agf(e5),ct([e5,e6],[0,1,[0,0,1,1]]),ct([e3,e6,e4,e7],[0,2,[6,1,0,0,5,9,4,8,9,10,3,3,2,6,1,2,7,4,8,7]],[1,2,[0,5]],[1,3,[1,0,2,1]]),[afoo(e4,e7),afii(e8),afi(t2)],cw())
            cxp([ct([e8,e9],[0,1,[1,1,0,0,3,3,2,2,4,5,8,9,9,10,10,11,5,6,6,7,7,8]]),at(t2,t3)],cw(0),ac(e9[6:8],[ww,bb]),at(t3,t4),awi(e9[6],scale_value=1.5,run_time=3),at(e9,e10),[at(t4,t5),ct([e10,e11],[0,1,[1,1,0,0,9,10,10,11,11,12,3,3,2,2,6,6,7,7,8,9,5,5,4,4]])],cw(0))    
            cxp(afo(t5,e11))
        def playscene10():
            oeo('o',{1:otf('α-H 的卤化'),2:otf2('碱性机理')})
            oem('f',7)
            oen({1:'甲基酮在碱性条件下可以与卤素反应生成卤仿'})
            oen2({1:'首先甲基酮发生三次卤代反应',2:'三卤甲基的吸电子作用活化了羰基,易发生加成反应',3:'碳碳键断裂'})
            oeo('x',{1:msmc('oh'),2:'卤仿'})
            ufnt(o2,o1,r,x2,f7,d)
            ufsc(f1,0.9,x1,0.8)
            ufsh(f2,0.5*u);uos(1.5,f2,f3,f4,f5,f6,f7)
            ufsh(f5,5*r,x2,4.5*r,f7,4*r)
            ufc(n2[0:4],gg)
            
#             uc(f1,f2)
            
            sa(o1,o2);
            cxp([afi(f1),afi(t1)],cw(),[ct([f1,f2],[0,1,[0,5,1,0,2,1,3,2,4,3,5,7,6,8,7,9]]),at(t1,n1)],cw(0.5),[at(n1,n2),ac(f2[0:5],[gg,ww])],agf(x1),cw(0),ct([f2,x1,f3],[0,2,['0.9','0.9',9,12]],[1,2,[0,9,1,10,2,11]]))
            cxp(cw(0),[at(n2,n3),ct([f3,f4,f5],[0,1,[5,0,0,1,7,2,9,3,10,4]],[0,2,[4,3,1,0,2,1,3,2]])],afo(n3),ct([f4,f5,f6,f7],[0,2,[0,0,1,1,2,2,3,3]],[0,3,[4,1]],[1,3,[0,0,1,2,2,3]]),agf(x2),afoo(f6,f7,x2))
View Code
复制代码

 playscene 11~

复制代码
        if True:
            r = RIGHT;l = LEFT;d = DOWN;u = UP;du = DEGREES;rr = RED;bb = BLUE;gg = GREEN;gg2 = GOLD;pp = PINK;tt = TEAL;ww = WHITE;o = ORIGIN
        if type('manim CE') == str:
    #         self.play()
            def sp(*args, **kwargs):
                return self.play(*args, **kwargs)
    #         self.wait()
            def sw(*args, **kwargs):
                return self.wait(*args, **kwargs)
    #         self.add() and self.wait()
            def saw(*args, **kwargs):
                '''
                    if use return, only one sentence can be returned
                '''
                self.add(*args, **kwargs);self.wait()
    #         self.add()
            def sa(*args, **kwargs):
                return self.add(*args, **kwargs)
    #         self.clear()
            def sc(*args, **kwargs):
                return self.clear(*args, **kwargs)
    #         self.remove()
            def sr(*args, **kwargs):
                return self.remove(*args, **kwargs)

    #         Animation Transform()
            def at(a, b, *args, **kwargs):
                '''
                improve: a will not change after transform
                '''
                a.save_state()  
                return Succession(ReplacementTransform(a, b, *args, **kwargs),Restore(a,run_time=0))
#             Animation Transform()
            def at0(a, b, *args, **kwargs):
                return Transform(a, b, *args, **kwargs)
    #         Animation ReplacementTransform()
            def art(a, b, *args, **kwargs):
                return ReplacementTransform(a, b, *args, **kwargs)
        #         Animation TransformMatchingShapes()
            def atm(a, b, *args, **kwargs):
                return TransformMatchingShapes(a, b, *args, **kwargs)
    #         Animation ClockwiseTransform()
            def act(a, b, *args, **kwargs):
                return ClockwiseTransform(a, b, *args, **kwargs)
    #         Animation CounterclockwiseTransform()
            def acct(a, b, *args, **kwargs):
                return CounterclockwiseTransform(a, b, *args, **kwargs)
    #         Animation Write()
            def aw(a, *args, **kwargs):
                return Write(a, *args, **kwargs)
    #         Animation Wiggle()
            def awi(a, *args, **kwargs):
                return Wiggle(a, *args, **kwargs)
    #         Animation LaggedStart()
            def als(a, *args, **kwargs):
                return LaggedStart(a, *args, **kwargs)
    #         Animation Unwrite()
            def auw(a, *args, **kwargs):
                return Unwrite(a, *args, **kwargs)
    #         Animation FadeOut()
            def afo(a, *args, **kwargs):
                return FadeOut(a, *args, **kwargs)
    #         Animation FadeIn()
            def afi(a, *args, **kwargs):
                return FadeIn(a, *args, **kwargs)
    #         Animation FadeOut()
            def afoo(a, *args, **kwargs):
                return FadeOut(a, *args, shift=DOWN, **kwargs)
    #         Animation FadeIn()
            def afii(a, *args, **kwargs):
                return FadeIn(a, *args, shift=DOWN, **kwargs)
    #         Animation Restore()
            def are(a, *args, **kwargs):
                return Restore(a, *args, **kwargs)
    #         Animation Rotate()
            def aro(a, b, *args, **kwargs):
                return Rotate(a, about_point = b, *args, **kwargs)  # 注意b有可能是坐标,有可能是物体
#                 return Rotate(a, about_point = b.get_center(), *args, **kwargs)
    #         Animation DrawBorderThenFill()
            def adb0(a, *args, **kwargs):
                return DrawBorderThenFill(a, *args, **kwargs)
    #         Animation DrawBorderThenFill()
            def adb(*args, **kwargs):
                li = []
                for i in args:
                    li.append(DrawBorderThenFill(i, **kwargs))
                return AnimationGroup(*li)
    #         Animation DrawBorderThenFill() reverse
            def adbr(a, *args, **kwargs):
                return DrawBorderThenFill(a, *args, **kwargs, reverse_rate_function = True)
    #         Animation GrowFromCenter()
            def agf0(a, *args, **kwargs):
                return GrowFromCenter(a, *args, **kwargs)
            def agf(*args, **kwargs):
                li = []
                for i in args:
                    li.append(GrowFromCenter(i, **kwargs))
                return AnimationGroup(*li)
    #         Animation GrowFromEdge()
            def agfe(a, b, *args, **kwargs):
                return GrowFromEdge(a, b, *args, **kwargs)
    #         Animation GrowFromPoint()
            def agfp(a, b, *args, **kwargs):
                return GrowFromPoint(a, b, *args, **kwargs)
    #         Animation MoveAlongPath()
            def ama(a, b, *args, **kwargs):
                return MoveAlongPath(a, b, *args, **kwargs)
#             Animation SpinInFromNothing
            def asi(a, *args, **kwargs):
                return SpinInFromNothing(a, angle=2 * PI, *args, **kwargs)
#             Animation SpinInFromNothing reverse
            def asir(a, *args, **kwargs):
                return SpinInFromNothing(a, angle=2 * PI, *args, **kwargs, reverse_rate_function = True)
#             Animation ShrinkToCenter
            def ast0(a, *args, **kwargs):
                a.save_state()
                li = []
                li.append(ShrinkToCenter(a, *args, **kwargs))
                li.append(Restore(a, run_time=0))
                return Succession(*li)
            def ast1(a, *args, **kwargs):
                dot = Dot(radius=0.01).set_opacity(0).move_to(a)
                return at(a,dot)              
            def ast(*args, **kwargs):
                li = []
                for i in args:
                    li.append(ast1(i))
                return AnimationGroup(*li)
#             Animation Circumscribe
            def ac(a, *args, **kwargs):
                return Circumscribe(a, *args, **kwargs)
#             Animation Indicate
            def ai(a, *args, **kwargs):
                return Indicate(a, *args, **kwargs)
#             Animation Restore
            def ar(a, *args, **kwargs):
                return Restore(a, *args, **kwargs)
#             Animation Shift
            def ash(*args, **kwargs):
                li = []
                i = 1
                for a in args:
                    if i % 2 != 0:
                        li.append(ApplyMethod(a.shift, args[i], **kwargs))
                    i += 1
                return AnimationGroup(*li)
#             Animation Succession
            def asu(*args):
                return Succession(*args)
#             Animation moveto
            def amt(*args, **kwargs):
                li = []
                i = 1
                for a in args:
                    if i % 2 != 0:
                        li.append(ApplyMethod(a.move_to, args[i], **kwargs))
                    i += 1
                return AnimationGroup(*li)
#             Animation scale
            def asc(*args, **kwargs):
                li = []
                i = 1
                for a in args:
                    if i % 2 != 0:
                        li.append(ApplyMethod(a.scale, args[i], **kwargs))
                    i += 1
                return AnimationGroup(*li)
#             Animation coloring
            def ac(*args, **kwargs):
                li = []
                for i in range(len(args)):
                    if i % 2 == 0:
                        li.append(ApplyMethod(args[i].set_color, args[i+1], **kwargs))
                return AnimationGroup(*li)
#             Animation set opacity
            def aso(*args, **kwargs):
                li = []
                for i in range(len(args)):
                    if i % 2 == 0:
                        li.append(ApplyMethod(args[i].set_opacity, args[i+1], **kwargs))
                return AnimationGroup(*li)
            
    #         mobject Text
            def mt(text, *args, **kwargs):
                return Text(text, *args, **kwargs)
    #         mobject SVGMobject
            def msm(name, *args, **kwargs):
                sm = SVGMobject(f'D:\\manimSVG\\{name}.svg')
                return sm
    #         mobject SVGMobject constant
            def msmc(name, *args, **kwargs):
                sm = SVGMobject(f'D:\\manimSVG\\constants\\{name}.svg').scale(0.4).shift(5*r)
                return sm
    #         mobject MathTex
            def mmt(text, *args, **kwargs):
                return MathTex(text, *args, **kwargs)
    #         mobject VGroup
            def mvg(*args, **kwargs):
                return VGroup(*args, **kwargs)
    #         mobject ArcBetweenPoints
            def mab(a, b, *args, **kwargs):
                return ArcBetweenPoints(a.get_center(), b.get_center(), angle = 120*DEGREES, *args, **kwargs)
#             mobject DashedLine
            def mdl(a, b, *args, **kwargs):
                return DashedLine(a, b, *args, **kwargs)
#             mobject BraceBetweenMobject
            def mbbm(a,b,buff,rise=0,single=0,dire=DOWN):
                x = a.get_center() - b.get_center()
                y = x/np.sqrt(x[0]**2+x[1]**2+x[2]**2)
                if single == 0:
                    return BraceBetweenPoints(a.get_center() + buff + rise/2*y, b.get_center() + buff - rise/2*y)
                else:
                    return BraceBetweenPoints(a.get_center() + buff - rise/2*dire, b.get_center() + buff + rise/2*(dire))
        if type('object') == str:
    #         object text flower
            def otf(a, judge=1):
                '''
                    a represents the text
                    judge represents the type of text(normal or MarkupText(MathTex is inclined rather than upright))
                '''
                if judge == 1:
                    at = Text(a, font = 'STZhongsong',stroke_width=2).set_color(color = ['#f3e9e0', '#fea8a9'])
                elif judge == 2:
                    at = MarkupText(a, stroke_width=2).set_color(color = ['#f3e9e0', '#fea8a9'])
                fl = SVGMobject(r"D:\manimSource\svg\icon.svg")[8].rotate(PI/2).set_color(color = ['#fea8a9', '#f3e9e0']).scale(1.5)
                at.next_to(fl, RIGHT)
                vg = VGroup(fl, at)
                vg.set(height = 0.6).to_corner(UL)
                return vg
    #         object text flower2
            def otf2(a, judge=1):
                if judge == 1:
                    at = Text(a, font = 'STFangsong',stroke_width=2).set_color(color = ['#f3e9e0', '#b1d85c'])
                elif judge == 2:
                    at = MarkupText(a, stroke_width=2).set_color(color = ['#f3e9e0', '#b1d85c'])
                fl = SVGMobject(r"D:\manimSource\svg\icon.svg")[8].rotate(PI/2).set_color(color = ['#b1d85c', '#f3e9e0']).scale(1.5)
                at.next_to(fl, RIGHT)
                vg = VGroup(fl, at)
                vg.set(height = 0.6).to_corner(UL)
                return vg
    #         object text flower3
            def otf3(a, judge=1):
                if judge == 1:
                    at = Text(a, font = 'STFangsong',stroke_width=2).set_color(color = ['#f3e9e0', '#6A5ACD'])
                elif judge == 2:
                    at = MarkupText(a, stroke_width=2).set_color(color = ['#f3e9e0', '#6A5ACD'])
                fl = SVGMobject(r"D:\manimSource\svg\icon.svg")[8].rotate(PI/2).set_color(color = ['#6A5ACD', '#f3e9e0f']).scale(1.5)
                at.next_to(fl, RIGHT)
                vg = VGroup(fl, at)
                vg.set(height = 0.6).to_corner(UL).shift(2*DOWN)
                return vg
    #         object narrator
            def on(a):
                text = Text(a, font='STZhongsong').to_edge(DOWN).scale(0.6)
                return text
    #         object narrator 2
            def on2(a):
                text = Text(a, font='STFangsong').scale(0.7).to_edge(DOWN)
                return text
#             object group
            def og(a, num, mess=True):
                vg = VGroup()
                for i in range(num):
                    r = np.random.rand()*2.5 + 0.5
                    s = np.random.rand()*0.8 + 0.6
                    t = np.random.rand()*2*PI
                    ro = np.random.rand()*2*PI
                    if mess == True:
                        vg.add(a.copy().shift(r*np.cos(t)*RIGHT+r*np.sin(t)*UP).scale(s).rotate(ro))
                    else:
                        vg.add(a.copy())
                return vg
#             object autograph introduction
            def oai(a,b,c):
                pic=ImageMobject(a).scale(1.3).shift(3.5*l+0.8*u)
                name=xn(b).next_to(pic,DOWN);name2=xn(c).scale(0.8).next_to(name,DOWN)
                return Group(pic,name,name2)
#             object my design
            def omd(a):
                return SVGMobject(f"D:\\manimSource\\svg\\{a}.svg")
#             object execute narrator
            def oen(a):
                for i in a:
                    globals()[f't{str(i)}']=on(a[i])
#             object execute mobject
            def oem(name, num):
                for i in range(num):
                    globals()[name + str(i+1)]=msm(name + str(i+1))
#             object execute narrator2
            def oen2(a):
                for i in a:
                    globals()[f'n{str(i)}']=on2(a[i])
#             object execute object
            def oeo(name,a):
                '''
                attention: when you try to use object defined before in oeo(), you should run this function before you defined
                '''
                for i in a:
                    if type(a[i]) == str:
                        globals()[name + str(i)]=on2(a[i])
                    else:
                        globals()[name + str(i)]=a[i]
#             object flower circle
            def ofc(judge,num):
                vg = VGroup()
                f = SVGMobject(r"D:\manimSource\svg\icon.svg")[8].scale(1.5).shift(0.2*u)
                if judge == 1:
                    f.set_color(color = ['#fea8a9', '#f3e9e0'])
                elif judge == 2:
                    f.set_color(color = ['#b1d85c', '#f3e9e0'])
                elif judge == 3:
                    f.set_color(color = ['#6A5ACD', '#f3e9e0f'])
                for i in range(num):
                    vg.add(f.copy().rotate(i*2*PI/num,about_point=ORIGIN))
                return vg
#             object user
            def ou(a, c):
                img = ImageMobject(f"C:\\Users\\86158\\Music\\{a}.png").set(width=1)
                music = Text(c, font='STFangSong').scale(0.7).next_to(img,10*l)
                name = ImageMobject(f"C:\\Users\\86158\\Music\\{a}name.png").match_height(music).next_to(img,2*r)
                g = Group(img,name,music).move_to(o)
                return g
        if type('utilize') == str:
    #         utilize move and scale
            def ums(a, n1, b, n2):
                scale = b[n2].width/a[n1].width
                a.scale(scale)
                vect = b[n2].get_center() - a[n1].get_center()
                a.shift(vect)
#             utilize color and opacity init
            def ucoi(*args):
                def xc2h(c):
                    return rgb_to_hex(color_to_rgb(c))
                for a in args:
#                     先缩放再设置透明度(否则会消失不见)
                    a.set_opacity(1)
                    for i in a:
                        if xc2h(i.color) == '#ff0000':
                            i.set_color([RED_C, RED_E]).set_sheen(0.3).set_opacity(0.8)
                        elif xc2h(i.color) == '#ffff00':
                            i.set_color([GOLD_C, GOLD_E]).set_sheen(0.3).set_opacity(0.8)
                        elif xc2h(i.color) == '#00ff00':
                            i.set_color([GREEN_C, GREEN_E]).set_sheen(0.3).set_opacity(0.8)
                        elif xc2h(i.color) == '#00ffff':
                            i.set_color([TEAL_C, TEAL_E]).set_sheen(0.3).set_opacity(0.8)
                        elif xc2h(i.color) == '#0000ff':
                            i.set_color([BLUE_C, BLUE_E]).set_sheen(0.3).set_opacity(0.8)
                        elif xc2h(i.color) == '#ff00ff':
                            i.set_color([PINK_C, PINK_E]).set_sheen(0.3).set_opacity(0.8)
    #         utilize opacity scale
            def uos(num, *args):
                '''
                    num represents the magnification of the 1st mobject
                    args represent the mobjects
                '''
#             最好让透明度也一样
                def premovescale(a, b):
#                     x = VGroup()
#                     y = VGroup()
                    for i in a:
#                         设置get_fill_opacity() == 0.5会失效
                        if i.get_fill_opacity() < 1:
                            x = i
#                             x.add(i)
                    for j in b:
                        if j.get_fill_opacity() < 1:
                            y = j
#                             y.add(j)
                    scale = y.height/x.height
                    a.scale(scale)
#                     先缩放再移动
                    vector  = y.get_center() - x.get_center()
                    a.shift(vector)
                args[0].scale(num)
                for n in range(len(args) - 1):
                    premovescale(args[n+1], args[n])
                ucoi(*args)
    #         utilize check
            def uc(*args):
                self.camera.background_color = WHITE
                full = FullScreenRectangle()
                for svg in args:
                    if type(svg) == list:
                        self.clear()
                        def checkedge(a):
                            for i in a:
                                if i.width/i.height > 1920/1080:
                                    i.set(width = full.width/2.5)
                                else:
                                    i.set(height = full.height/2.5)
                        checkedge(svg)
                        if len(svg) == 2:
                            svg[0].to_corner(UL)
                            svg[1].to_corner(DR)
                        elif len(svg) == 3:
                            svg[0].to_corner(UL)
                            svg[1].to_corner(UR)
                            svg[2].to_corner(DL)
                        elif len(svg) == 4:
                            svg[0].to_corner(UL)
                            svg[1].to_corner(UR)
                            svg[2].to_corner(DL)   
                            svg[3].to_corner(DR)   
                        for sss in svg:
                            self.add(sss.set(color = RED))
                        for sss in svg:
                            n = 0
                            for i in sss:
                                num = Integer(number=n, stroke_width=2).set_color(BLACK).move_to(i)
                                n += 1
                                self.add(num)
                        self.wait()
                    else:
                        self.clear()
                        self.add(svg.set(color = RED))
                        n = 0
                        for i in svg:
                            num = Integer(number=n, stroke_width=2).set_color(BLACK).move_to(i)
                            n += 1
                            self.add(num)
                        self.wait()
                self.clear()
#             utilize place in grid
            def upg(buff1, buff2, *args, align=LEFT):
                '''
                    such as upg(2,2,[a[0],a[1],a[2]],[a[3],a[4]])
                '''
                o = args[0][0]
                le = len(args[0])
                n = 0
                m = 0
                '''
                    n represents columns
                    m represents rows
                '''
                vg = VGroup()
                for i in args:
                    for j in i:
                        j.move_to(o.get_center() + buff1*n*r + buff2*m*d)
                        if i != args[0]:
                            j.align_to(args[0][n],align)
                        n += 1
                        n %= le
                        vg.add(j)
                    m += 1
                vg.move_to(ORIGIN)
                return vg
#             utilize place in grid for animation
            def upg0(buff1, buff2, *args, align=LEFT, co=0):
                '''
                    such as upg(2,2,[a[0],a[1],a[2]],[a[3],a[4]])
                '''
                o = args[0][0]
                le = len(args[0])
                n = 0
                m = 0
                '''
                    n represents columns
                    m represents rows
                '''
                vg = VGroup()
                vg0 = VGroup()
                for i in args:
                    for u in i:
                        j = u.copy()
                        j.move_to(o.get_center() + buff1*n*r + buff2*m*d)
                        if i != args[0]:
                            j.align_to(vg[n],align)
                        n += 1
                        n %= le
                        vg.add(j)
                        vg0.add(u)
                    m += 1
                vg.move_to(ORIGIN)
                if co == 0:
                    return at0(vg0,vg)
                else:
                    return vg
#             utilize place in line
            def upl(buff,*args,dire=DOWN, align=LEFT):
                o = args[0]
                n = 0
                for i in args:
                    i.move_to(o.get_center() + n*buff*dire)
                    i.align_to(o, align)
                    n += 1
                vg = VGroup(*args)
                vg.move_to(ORIGIN)
                return vg
#             utilize place in line for animation
            def upl0(buff,*args,dire=DOWN, align=LEFT, co=0):
                o = args[0]
                n = 0
                vg = VGroup()
                vg0 = VGroup()
                for u in args:
                    i = u.copy()
                    i.move_to(o.get_center() + n*buff*dire)
                    i.align_to(o, align)
                    n += 1
                    vg.add(i)
                    vg0.add(u)
                vg.move_to(ORIGIN)
                if co == 0:
                    return at0(vg0,vg)
                else:
                    return vg
#             utilize part next to
            def upnt(a,n,b,m,buff):
                '''
                    shortcoming: if a[1][1]?
                '''
                a1 = a[n].copy()
                a[n].next_to(b[m],buff)
                vect = a[n].get_center() - a1.get_center()
                aleft = mvg(a[0:n],a[n+1:])
                aleft.shift(vect)
#             utilize part next to for animation
            def upnt0(a,n,b,m,buff,co=0):
                a1 = a[n].copy()
                a2 = a[n].copy()
                a2.next_to(b[m],buff)
                vect = a2.get_center() - a1.get_center()
                vg = a.copy().shift(vect)
                vg0 = a
                if co == 0:
                    return at0(vg0,vg)
                else:
                    return vg
#             utilize place in circle
            def upc(r, *args):
                n = 0
                vg = VGroup()
                for i in args:
                    i.move_to(ORIGIN)
                    i.shift(r*np.cos(n*2*PI/len(args) + PI/2)*RIGHT + r*np.sin(n*2*PI/len(args) + PI/2)*UP)
                    vg.add(i)
                    n += 1
                return vg
#             utilize place in circle for animation
            def upc0(r, *args, co=0):
                n = 0
                vg = VGroup()
                vg0 = VGroup()
                for i in args:
                    u = i.copy()
                    u.move_to(ORIGIN)
                    u.shift(r*np.cos(n*2*PI/len(args) + PI/2)*RIGHT + r*np.sin(n*2*PI/len(args) + PI/2)*UP)
                    vg.add(u)
                    vg0.add(i)
                    n += 1
                if co == 0:
                    return at0(vg0,vg)
                else:
                    return vg
#             utilize forehead shift
            def ufsh(*args):
                i = 1
                for a in args:
                    if i % 2 != 0:
                        a.shift(args[i])
                    i += 1
#             utilize forehead scale
            def ufsc(*args):
                i = 1
                for a in args:
                    if i % 2 != 0:
                        if type(a) == list:
                            for j in a:
                                j.scale(args[i])
                        else:
                            a.scale(args[i])
                    i += 1 
#             utilize forehead opacity
            def ufo(*args):
                i = 1
                for a in args:
                    if i % 2 != 0:
                        a.set_opacity(args[i])
                    i += 1 
#             utilize forehead coloring
            def ufc(*args):
                i = 1
                for a in args:
                    if i % 2 != 0:
                        a.set_color(args[i])
                    i += 1 
#             utilize forehead move to
            def ufmt(*args):
                i = 1
                for a in args:
                    if i % 2 != 0:
                        a.move_to(args[i])
                    i += 1 
#             utilize forehead next to
            def ufnt(*args):
                i = 0
                for a in args:
                    if i % 3 == 0:
                        a.next_to(args[i+1], args[i+2])
                    i += 1
        if type('cartoon') == str:
    #         cartoon transform
            def ct(names, *args):
                '''
                    names: a list of mobjects
                    args represent lists, such as [0,1,[0,0,1,1,2,2]], the 1st and 2nd numbers represent the index of mobject in the names list
                '''
                
                '''
                    get the transforming part
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                ag = []
            #           range(0, n-1)是错的
                itemli = []
                for l in names:
                    itemli.append(list(range(len(l))))
                '''
                    delete the tranformed part
                '''
                def countli0(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                
                def countli(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                    elif type(i) == list:
                        for j in i:
                            item = countli0(name, j)
                            
                set1 = set()
                set2 = set()
                '''
                    two groups of transforming
                '''
                for m in range(len(args)):
                    n = 0
                    for i in args[m][2]:
                        n += 1
                        if n % 2 != 0:
                            u = pretrans(names[args[m][0]], i)
                            countli(itemli[args[m][0]], i)
                            set1.add(args[m][0])
                        else:
                            v = pretrans(names[args[m][1]], i)
                            item = at(u,v)
                            ag.append(item)
                            countli(itemli[args[m][1]], i)
                            set2.add(args[m][1])
                
                for i in set1:
                    for ii in itemli[i]:
                        names[i][ii].save_state()
                        ag.append(ast(names[i][ii]))
                for j in set2:
                    for jj in itemli[j]:
                        ag.append(agf(names[j][jj]))

                return AnimationGroup(*ag)
    #         cartoon transform 2
            def ct2(a, b, c):
                '''
                    a and b represent mobjects
                    c represents the corresponding transform parts
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                n = 0
                ag = []
            #           range(0, n-1)是错的
                for i in c:
                    n += 1
                    if n % 2 != 0:
                        u = pretrans(a, i)
                    else:
                        v = pretrans(b, i)
                        item = at(u,v)
                        ag.append(item)
                return AnimationGroup(*ag)
    #         cartoon transform 3
            def ct3(a, b, c):
                '''
                    a and b represent mobjects
                    c represents the corresponding transform parts
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                n = 0
                ag = []
            #           range(0, n-1)是错的
                for i in c:
                    n += 1
                    if n % 2 != 0:
                        u = pretrans(a, i)
                    else:
                        v = pretrans(b, i)
                        item = at0(u,v)
                        ag.append(item)
                return AnimationGroup(*ag)
    #         cartoon transform reverse
            def ctr(names, *args):
                '''
                    names: a list of mobjects
                    args represent lists, such as [0,1,[0,0,1,1,2,2]], the 1st and 2nd numbers represent the index of mobject in the names list
                    can't be used singlely, must be used after ct(), because here we use Restore()
                '''
                
                '''
                    get the transforming part
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                ag = []
            #           range(0, n-1)是错的
                itemli = []
                for l in names:
                    itemli.append(list(range(len(l))))
                '''
                    delete the tranformed part
                '''
                def countli0(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                
                def countli(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                    elif type(i) == list:
                        for j in i:
                            item = countli0(name, j)
                            
                set1 = set()
                set2 = set()
                '''
                    two groups of transforming
                '''
                for m in range(len(args)):
                    n = 0
                    for i in args[m][2]:
                        n += 1
                        if n % 2 != 0:
                            u = pretrans(names[args[m][0]], i)
                            countli(itemli[args[m][0]], i)
                            set1.add(args[m][0])
                        else:
                            v = pretrans(names[args[m][1]], i)
                            item = at(v,u)
                            ag.append(item)
                            countli(itemli[args[m][1]], i)
                            set2.add(args[m][1])
                
                for i in set1:
                    for ii in itemli[i]:
                        ag.append(Restore(names[i][ii]))
                        '''
                            agf() doesn't work after ast()
                        '''
                for j in set2:
                    for jj in itemli[j]:
                        ag.append(ast(names[j][jj]))

                return AnimationGroup(*ag)
#             cartoon animations list
            def cal(t,*argss):
                args = []
                for i in argss:
                    args.append(i)
#                 不是args = args.reverse()
                args.reverse()
                n = 0
                for a in args:
                    if n == 1:
                        ag = AnimationGroup(args[1],args[0],lag_ratio=t)
                    elif n > 1:
                        ag = AnimationGroup(a,ag,lag_ratio=t)
                    n += 1
                return ag
#             cartoon xxp play
            def cxp(*args):
                for a in args:
                    if type(a) == list:
                        self.wait(0.5)
                        self.play(*a)
                        self.wait(0.5)
                    elif type(a) == tuple:
                        self.clear()
                        self.add(*a)
#                     elif type(a) == tuple:
#                         for i in a:
#                             self.play(i)
                    else:
                        self.wait(0.5)
                        self.play(a)
                        self.wait(0.5)
#             cartoon move along arc
            def cmaa(a,b,c,s):
                '''
                    a represents the moving mobject
                    b and c represent the starting and ending point
                    s represents the direction
                '''
                arc = ArcBetweenPoints(b.get_center(), c.get_center(), angle = s*120*DEGREES)
                return MoveAlongPath(a, arc)
#             cartoon move around
            def cma(*args,t=3):
                ag = []
                for a in args:
                    li = []
                    center = a.get_center()
                    for i in range(t):
                        x = np.random.rand()*0.3
                        y = np.random.rand()*2*PI
                        li.append(amt(a,center+x*np.cos(y)*r+x*np.sin(y)*u,run_time=0.5,rate_func=rate_functions.smooth))
                    ag.append(asu(*li))
                return AnimationGroup(*ag)
#             cartoon fade in
            def cfi(*args):
                li = []
                for i in args:
                    dots = og(Dot(),len(i)).set_color(WHITE).set_opacity(0)
                    li.append(at(dots,i))
                return AnimationGroup(*li)
#             cartoon fade out
            def cfo(*args):
                li = []
                for i in args:
                    dots = og(Dot(),len(i)).set_color(WHITE).set_opacity(0)
                    li.append(at(i,dots))
                return AnimationGroup(*li)
#             cartoon wait
            def cw(*args):
                return Wait(*args)
#             cartoon flower circle
            def cfc(*args):
                li = []
                li2 = []
                o = args[0][0].copy().rotate(-PI/2).move_to(ORIGIN).shift(0.6*u)
                vg0 = VGroup()
                vg0.add(o)
                for i in range(len(args)-1):
                    k = o.copy()
                    li.append(aro(k,ORIGIN,angle=-(i+1)*2*PI/len(args)))
                    vg0.add(k)
                
                li2.append(agf(vg0))
                li2.append(cw(1))
                li2.append(cal(0.1,*li))
                li2.append(cw(1))
                vg = VGroup()
                vg2 = VGroup()
                for i in args:
                    vg.add(i[0])
                    vg2.add(i[1])
                ag = []
                l = 0
                for i in vg0:
                    ag.append(at(i,vg[l]))
                    l += 1
                li2.append(AnimationGroup(*ag))
                '''
                    use wisely of at and at0
                    bug: when use at(vg0, vg), it's not the expected effect. when AnimationGroup(at(i,j)…) (i and j is the single part of mobject) is the preferred choice
                '''
                li2.append(cw(1))
                li2.append(cfi(*vg2))
                return asu(*li2)
#             catroon add
            def ca(*args):
                for i in args:
                    if type(i) == list:
                        sc();saw(*i)
                    else:
                        sc();saw(i)
View Code
复制代码

 

posted @   树叶本子  阅读(272)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示