BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1311|回复: 2

[无节操]手贱测试脚本2(面板达成)

[复制链接]
发表于 2013-2-22 16:31:32 | 显示全部楼层 |阅读模式
本帖最后由 牛二爷 于 2013-2-23 20:51 编辑
  1. bl_info = {
  2.     'name': "ox2ye nojiecao",
  3.     'author': "ox2ye<gkseven@gmail.com>",
  4.     'version': (),
  5.     'blender': (),
  6.     'location': "3d view->ui(press 'n')",
  7.     'description': "",
  8.     'warning': "",
  9.     'wiki_url': "",
  10.     'tracker_url': "",
  11.     'category': "Object"}
  12. #脚本运行后,在3dview的n面板最底下   
  13. import bpy
  14. import time
  15. import math
  16. import random

  17. # methods:可以自定义排列方式,请照例编写函数
  18. #有且只有4个参数分别:obj代表要复制的物体,i代表目前是第几项,counts总共要复制的物体个数
  19. #cex代表偏移量(面板中的offset)编写好以后修改hash表

  20. def array(obj,i,counts,cex):
  21.     max = int(counts**(1/3)//1 +1)
  22.     lx=i//(max**2)
  23.     ly=(i-(lx*max**2))//max
  24.     lz=(i-(lx*max**2)-ly*max)%max
  25.     obj.location=(lx*cex,ly*cex,lz*cex)   
  26.       
  27. def randarray(obj,i,counts,cex):
  28.     max = int(counts**(1/3)//1 +1)
  29.     lx=i//(max**2)
  30.     ly=(i-(lx*max**2))//max
  31.     lz=(i-(lx*max**2)-ly*max)%max
  32.     obj.location=(lx*cex+random.random()-1,ly*cex+random.random()-1,lz*cex+random.random()-1)   

  33. def sewer(obj,i,counts,cex):
  34.     i=i+1
  35.     lx=counts/i*(math.cos(i))
  36.     ly=counts/i*(math.sin(i))
  37.     lz=-1*i/30
  38.     obj.location=(lx*cex,ly*cex,lz*cex)

  39. def pyramid(obj,i,counts,cex):
  40.     i=i+1
  41.     def whereis(i):
  42.         x=i-1
  43.         y=1
  44.         while x>0:
  45.             x=x-y*4
  46.             y=y+1
  47.         if y>1:
  48.             z=x+(y-1)*4-1
  49.             if z==0:
  50.                 return(y,z,z)
  51.             else:
  52.                 m=1
  53.                 n=z
  54.                 if z-m*(y-1)>=0:
  55.                     m=2
  56.                     n=z-1*(y-1)
  57.                     if z-m*(y-1)>=0:
  58.                         m=3
  59.                         n=z-2*(y-1)
  60.                         if z-m*(y-1)>=0:
  61.                             m=4
  62.                             n=z-3*(y-1)
  63.                
  64.                 return(y,m,n)
  65.            

  66.         
  67.         else:
  68.             return(1,0,0)
  69.     def toloc(x,y,z,cex):
  70.         if x==1:
  71.             return (0,0,0)
  72.         if x==2:
  73.             if y==0:
  74.                 return(-0.5*cex,-0.5*cex,-1*cex)
  75.             if y==2:
  76.                 return(0.5*cex,-0.5*cex,-1*cex)
  77.             if y==3:
  78.                 return(0.5*cex,0.5*cex,-1*cex)
  79.             if y==4:
  80.                 return(-0.5*cex,0.5*cex,-1*cex)
  81.         else:
  82.             locx=-0.5*(x-1)*cex
  83.             locy=-0.5*(x-1)*cex
  84.             locz=-1*(x-1)*cex
  85.             if y==0:
  86.                 return(locx,locy,locz)
  87.             else:
  88.                 if y==1:
  89.                     return(locx+z*cex,locy,locz)
  90.                 if y==2:
  91.                     return(locx+(x-1)*cex,locy+z*cex,locz)
  92.                 if y==3:
  93.                     return(locx+(x-z-1)*cex,locy+(x-1)*cex,locz)
  94.                 if y==4:
  95.                     return(locx,locy+(x-z-1)*cex,locz)
  96.     a,b,c=whereis(i)
  97.     lx,ly,lz=toloc(a,b,c,cex)
  98.     obj.location=(lx*cex,ly*cex,lz*cex)
  99.             
  100. def cone(obj,i,counts,cex):
  101.     obj.location=(10*(1+i)*math.cos(i*360)/cex/50,10*(1+i)*math.sin(i*360)/cex/50,i/cex)
  102.    
  103. def cylinder(obj,i,counts,cex):
  104.     i=i+1
  105.     obj.location=(math.cos(i)*cex,math.sin(i)*cex,math.tan(i/counts-0.5)*50)
  106.     bpy.data.objects[obj.name].dimensions=(i**(1/3)/cex,i**(1/3)/cex,i**(1/3)/cex)
  107.    
  108. #==========================methods hash=============================
  109. methodlist=[('0', 'array', 'array'),
  110.             ('1', 'rand array', 'random array'),
  111.              ('2', 'sewer', 'sewer'),
  112.              ('3','Pyramid','Pyramid'),
  113.              ('4','cone','cone'),
  114.              ('5','cylinder','cylinder')]
  115. method={0:array,1:randarray,2:sewer,3:pyramid,4:cone,5:cylinder}

  116. #编写好函数以后请照例修改以上两项
  117. #以下不必修改
  118. #===================================================================
  119. def clear_all():
  120.     '''clear all'''
  121.     bpy.ops.object.select_all()
  122.     if len(bpy.context.selected_objects)==0:
  123.         bpy.ops.object.select_all()
  124.         bpy.ops.object.delete()
  125.     else:
  126.         bpy.ops.object.select_all()
  127.         bpy.ops.object.select_all()
  128.         bpy.ops.object.delete()
  129.         
  130. def initprops(scn):            #初始化场景参数
  131.     bpy.types.Scene.mycounts=bpy.props.IntProperty(name='Counts')
  132.     scn['mycounts']=200
  133.     bpy.types.Scene.myoffset=bpy.props.FloatProperty(name='Offset',default=5,min=0.5,max=10)
  134.     scn['myoffset']=1.5
  135.     bpy.types.Scene.myobjs = bpy.props.EnumProperty(
  136.     items = [('cube', 'cube', 'cube'),
  137.             ('monkey', 'monkey', 'monkey'),
  138.              ('selected', 'selected', 'objs you selected')],
  139.     name = "Objects")
  140.     scn['myobjs']=0
  141.     bpy.types.Scene.mymthds = bpy.props.EnumProperty(
  142.     items = methodlist,
  143.     name = "Methods")
  144.     scn['mymthds']=3
  145. initprops(bpy.context.scene)   
  146.    
  147. def checkprops():    #检查场景参数是否正确
  148.     scn=bpy.context.scene
  149.     try:
  150.         scn['mycounts']
  151.         scn['myobjs']
  152.         scn['mymthds']
  153.         scn['myoffset']
  154.          
  155.     except KeyError:
  156.         initprops(scn)
  157.      
  158.         
  159. def createobj(x):        #第一步创建物体,然后将此物体传递给下一个操作
  160.     if x==0:
  161.         bpy.ops.mesh.primitive_cube_add()
  162.         return bpy.context.scene.objects.active
  163.     if x==1:
  164.         bpy.ops.mesh.primitive_monkey_add()
  165.         return bpy.context.scene.objects.active
  166.     if x==2:
  167.         if bpy.context.scene.objects.active!=None:
  168.             bpy.ops.object.duplicate_move()
  169.             return bpy.context.scene.objects.active
  170.         else:
  171.             bpy.ops.mesh.primitive_cube_add()
  172.             return bpy.context.scene.objects.active
  173. def go(counts,offset,objs,mtheds):   #按下go,这个函数被调用
  174.     for i in range(0,counts):               #重复counts次
  175.         curobj=createobj(objs)             #第一步创建物体
  176.         method[mtheds](curobj,i,counts,offset)         #第二步进行位移等操作
  177.    

  178. class oxpanel(bpy.types.Panel):          #自定义面板
  179.     bl_label='Ox2ye NoJieCao'
  180.     bl_space_type="VIEW_3D"
  181.     bl_region_type="UI"
  182.    
  183.     def draw(self,context):
  184.         self.layout.label(text='Step 1.Be prepared.')
  185.         self.layout.operator('ox.clear')
  186.         self.layout.operator('ox.init')
  187.         self.layout.label(text='Step 2.Pick')
  188.         scn=bpy.context.scene
  189.         self.layout.prop(scn,'mycounts',toggle=True)
  190.         self.layout.prop(scn,'myoffset',toggle=True)
  191.         self.layout.prop_menu_enum(scn,'myobjs')
  192.         self.layout.prop_menu_enum(scn,'mymthds')
  193.         self.layout.label(text='Step 3.go!')
  194.         self.layout.operator('ox.go')
  195.         

  196.         
  197. class OBJECT_OT_clear(bpy.types.Operator):   #自定义操作
  198.     bl_idname='ox.clear'
  199.     bl_label='Clear all objects'
  200.     def execute(self,context):
  201.         clear_all()
  202.         return {'FINISHED'}

  203. class OBJECT_OT_init(bpy.types.Operator):
  204.     bl_idname='ox.init'
  205.     bl_label='Reset Menus'
  206.     def execute(self,context):
  207.         initprops(bpy.context.scene)
  208.         return {'FINISHED'}   
  209.    
  210. class OBJECT_OT_go(bpy.types.Operator):
  211.     bl_idname='ox.go'
  212.     bl_label='go!!'
  213.     def execute(self,context):
  214.         checkprops()
  215.         scn=bpy.context.scene
  216.         if scn['mycounts']<=0:
  217.             scn['mycounts']=1
  218.         starttime=time.time()
  219.             
  220.         go(scn['mycounts'],scn['myoffset'],scn['myobjs'],scn['mymthds'])
  221.         endtime=time.time()
  222.         a={0:'cube',1:'monkey',2:'custom obj'}
  223.         if len(bpy.data.objects)>0:
  224.             bpy.ops.object.text_add(location=(0,-30,0))
  225.             
  226.             bpy.data.objects["Text"].data.body = ('%d %ss,method:%s\nused %0.4f sec'%(scn['mycounts'],a[scn['myobjs']],methodlist[scn['mymthds']][2],endtime-starttime))
  227.         else:
  228.             bpy.ops.object.text_add(location=(0,-30,0))
  229.             bpy.data.objects["Text"].data.body = ('error!\nused %0.4f sec'%(endtime-starttime))
  230.         
  231.         bpy.ops.object.camera_add(location=(5,-30,20),rotation=(0,0,0))

  232.         return {'FINISHED'}        
  233.         
  234. bpy.utils.register_module(__name__)    #使自定义的部分生效
复制代码
02-22跑完脚本,按f12,查看耗时。
取消了刚体、烘焙。使得大部分版本都可以跑
增加了几种排列方式
02-23集成至面板,除了cube和猴子外,可以自定义物体,复制排列(选中然后面板objects里选selected)
 楼主| 发表于 2013-3-1 11:37:26 | 显示全部楼层
没意义啦!我只是挂羊头卖狗肉。了解一下脚本~
回复 支持 反对

使用道具 举报

发表于 2013-4-18 00:35:55 | 显示全部楼层
额~ 都写这么多了。

上次的印象还只有20~30行,我还说把你这个作为基础教程链接一下,直接成了高级范例了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-11-21 20:11 , Processed in 0.015918 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表