BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1593|回复: 3

各种自制脚本囤积

[复制链接]
发表于 2015-10-21 11:13:31 | 显示全部楼层 |阅读模式
本帖最后由 岸子岸子 于 2016-1-4 16:17 编辑

批量布尔脚本
由于带动画的复杂网格布尔运算无法快速播放 所以写了下面的脚本  
可以在指定的时间范围内,将原物体在每一帧复制一个并把布尔修改器应用后归入一个空物体的子集下,在可见&渲染可见属性上k帧,使序列网格连成动画
现在如果选择多个布尔物体,生成的网格序列会归入多个空物体下,空物体坐标为源物体坐标

内容:
  ui界面

  对多个物体执行布尔
  删除布尔物体功能

  可替代已存在的布尔物体
屏幕截图(3).jpg compxxx_0002.gif

  1. bl_info = {
  2.     "name": "[v]Boolean_Tool",
  3.     'author':'Jianzwan',
  4.     'version':(1,1),
  5.     "blender":(2,76,0),
  6.     "location":'View3D>Tool shelf',
  7.     "description": "multiply obj/ui/?",
  8.     "category": "Jianzwan",
  9. }
  10. import bpy

  11. delSamBaBaNam = True
  12. delSamNam = True

  13. bpy.types.Scene.startFrame = bpy.props.IntProperty(
  14.     description = 'Boolean start frame',
  15.     default = 1)
  16. bpy.types.Scene.endFrame = bpy.props.IntProperty(
  17.     description = 'Boolean end frame',
  18.     default = 10)
  19. bpy.types.Scene.delStart = bpy.props.IntProperty(
  20.     description = 'delete start frame',
  21.     default = 1)
  22. bpy.types.Scene.delEnd = bpy.props.IntProperty(
  23.     description = 'delete end frame',
  24.     default = 10)
  25. bpy.types.Scene.modfName = bpy.props.StringProperty(
  26.     description = 'modifier name',
  27.     default = 'Boolean')
  28. bpy.types.Scene.delSamBaBaNam = bpy.props.BoolProperty(
  29.     description = 'del same BaBa',
  30.     default = True)
  31. bpy.types.Scene.saveCurChild = bpy.props.BoolProperty(
  32.     description = 'save current children',
  33.     default = True)
  34. ### number name "'{0:0>4}'.format(i)"in doc string-Common string operations
  35. def nName(name,i):
  36.     rname = name + '{0:0>3}'.format(i)
  37.     return rname
  38. def childName(name,i):
  39.     rname = '{0:0>3}'.format(i) + name
  40.     return rname
  41. def dltChild(a,b):
  42.     scene = bpy.context.scene
  43.     selobj = bpy.context.selected_objects
  44.     for obj in selobj:
  45.         for one in obj.children:
  46.             if int(one.name[0:3]) in range(a,b+1):
  47.                 omesh = one.data
  48.                 scene.objects.unlink(one)
  49.                 bpy.data.objects.remove(one)
  50.                 bpy.data.meshes.remove(omesh)

  51. class BooleanTool(bpy.types.Operator):
  52.     bl_idname= "object.boolean"
  53.     bl_label= "Do boolean"
  54.     bl_options= {'REGISTER', 'UNDO'}
  55.    
  56.     def execute(self,context):
  57.         scene = bpy.context.scene
  58.         actNam = scene.objects.active
  59.         selObj = bpy.context.selected_objects
  60.         blDat = bpy.context.blend_data
  61.         alObj = blDat.objects
  62.         
  63.         for obj in selObj :
  64.             for obj0 in selObj :
  65.                 obj0.select = False
  66.             #
  67.             curfrm = scene.startFrame
  68.             scene.frame_set(curfrm)
  69.             obj.select = True
  70.             ##empty object name
  71.             empName = obj.name + '_BaBa'
  72.             ##create new parent empty object
  73.             goOn = True
  74.             newBaba = True
  75.             i = 1
  76.             while goOn == True :
  77.                 for objInAll in alObj :
  78.                     if nName(empName,i) == objInAll.name : #search same name+i
  79.                         if scene.delSamBaBaNam == True :
  80.                             newBaba = False
  81.                             nBaba = objInAll
  82.                             if scene.saveCurChild == True:
  83.                                 objInAll.select = True
  84.                                 dltChild(scene.startFrame,scene.endFrame)
  85.                                 objInAll.select = False
  86.                             else:
  87.                                 for one in objInAll.children:  #delete children
  88.                                     omesh = one.data
  89.                                     scene.objects.unlink(one)
  90.                                     bpy.data.objects.remove(one)
  91.                                     bpy.data.meshes.remove(omesh)
  92.                                 #scene.objects.unlink(objInAll)
  93.                                 #bpy.data.objects.remove(objInAll)
  94.                         else:
  95.                             i += 1
  96.                             goOn = True
  97.                             break
  98.                     goOn = False
  99.                     
  100.             if newBaba == True :
  101.                 nBaba = bpy.data.objects.new(nName(empName,i),None)
  102.                 nBaba.location = obj.location
  103.                 scene.objects.link(nBaba)
  104.             
  105.             while curfrm <= scene.endFrame :
  106.                 obj.select = True
  107.                 bpy.ops.object.duplicate_move()
  108.                 dulSelObj = bpy.context.selected_objects
  109.                 print(dulSelObj)
  110.                 obj2 = dulSelObj[0]
  111.                 #for obj2 in dulSelObj :
  112.                 scene.objects.active = nBaba
  113.                 bpy.ops.object.parent_set(type='OBJECT', keep_transform=False)
  114.                 scene.objects.active = obj2
  115.                 bpy.ops.object.modifier_apply(apply_as='DATA',modifier= scene.modfName)
  116.                
  117.                 obj2.name= childName(obj.name , curfrm)
  118.                 obj2.hide_render=1
  119.                 obj2.hide=1
  120.                 obj2.keyframe_insert(data_path= "hide_render",frame= curfrm-1 )
  121.                 obj2.keyframe_insert(data_path= "hide",frame= curfrm-1 )
  122.                 obj2.hide_render=0
  123.                 obj2.hide=0
  124.                 obj2.keyframe_insert(data_path= "hide_render",frame= curfrm )
  125.                 obj2.keyframe_insert(data_path= "hide",frame= curfrm )
  126.                 obj2.hide_render=1
  127.                 obj2.hide=1
  128.                 obj2.keyframe_insert(data_path= "hide_render",frame= curfrm+1 )
  129.                 obj2.keyframe_insert(data_path= "hide",frame= curfrm+1 )
  130.                 obj2.select = False
  131.                 print('obj2: ',obj2.select)
  132.                 for obj3 in selObj :
  133.                     obj3.select = False
  134.                     
  135.                 if curfrm == scene.endFrame:
  136.                     break
  137.                 curfrm += 1
  138.                 scene.frame_set(curfrm)
  139.                
  140.         for obj3 in selObj :
  141.             obj3.select = True
  142.             print(obj3)
  143.         scene.objects.active = actNam
  144.         print('########\n####\n')
  145.         return {'FINISHED'}
  146.    
  147. class deleteChilren(bpy.types.Operator):
  148.     bl_description= "delete children"
  149.     bl_idname= "object.delete_chilren"
  150.     bl_label= "delete these chilren"
  151.     bl_options= {'REGISTER', 'UNDO'}
  152.    
  153.     def execute(self,context):
  154.         scene = bpy.context.scene
  155.         dltChild(scene.delStart,scene.delEnd)
  156.         return {'FINISHED'}
  157.    
  158. class deleteAllChilren(bpy.types.Operator):
  159.     bl_description= "delete all children"
  160.     bl_idname= "object.delete_all_chilren"
  161.     bl_label= "delete all chilren"
  162.     bl_options= {'REGISTER', 'UNDO'}
  163.    
  164.     def execute(self,context):
  165.         scene = bpy.context.scene
  166.         selobj = bpy.context.selected_objects
  167.         for obj in selobj:
  168.             for one in obj.children:
  169.                 omesh = one.data
  170.                 scene.objects.unlink(one)
  171.                 bpy.data.objects.remove(one)
  172.                 bpy.data.meshes.remove(omesh)
  173.         return {'FINISHED'}

  174. class drawBoolean(bpy.types.Panel):
  175.     bl_category = 'Boolean'
  176.     bl_idname = "object.boolean"
  177.     bl_label = "[v]Boolean_Tool"
  178.     bl_space_type = 'VIEW_3D'
  179.     bl_region_type = 'TOOLS'
  180.    
  181.     def draw(self, context):
  182.         scene = bpy.context.scene
  183.         layout = self.layout
  184.         column = layout.column()
  185.         row = column.row()
  186.         row.prop(scene,"startFrame",text= '|<')
  187.         row.prop(scene,"endFrame",text= '>|')
  188.         row = column.row()
  189.         row.prop(scene,"modfName",text='')
  190.         row = column.row()
  191.         row.prop(scene,"delSamBaBaNam",text= 'no new BaBa')
  192.         row.prop(scene,"saveCurChild",text= '保留存在的子物体')
  193.         row = column.row()
  194.         row.operator("object.boolean")
  195.         row = column.row()
  196.         row.prop(scene,"delStart",text= '|<')
  197.         row.prop(scene,"delEnd",text= '>|')
  198.         column.operator("object.delete_chilren")
  199.         column.operator("object.delete_all_chilren")
  200.         
  201. def register():
  202.     bpy.utils.register_class(BooleanTool)
  203.     bpy.utils.register_class(drawBoolean)
  204.     bpy.utils.register_class(deleteChilren)
  205.     bpy.utils.register_class(deleteAllChilren)
  206.    
  207. def unregister():
  208.     bpy.utils.unregister_class(BooleanTool)
  209.     bpy.utils.unregister_class(drawBoolean)
  210.     bpy.utils.unregister_class(deleteChilren)
  211.     bpy.utils.unregister_class(deleteAllChilren)
复制代码


 楼主| 发表于 2016-1-4 16:14:50 | 显示全部楼层
显示辅助脚本
批量物体子物体 线框 边界框 显示
批量子物体 层 设置
  1. bl_info = {
  2.     "name": "[v]Display_Tool",
  3.     'author':'Jianzwan',
  4.     'version':(0,0),
  5.     "blender":(2,76,0),
  6.     "location":'View3D>Tool shelf',
  7.     "description": "multiply obj/ui/?",
  8.     "category": "Jianzwan",
  9. }
  10. import bpy

  11. class ControlChildLayers(bpy.types.Operator):
  12.     bl_idname= "object.layer"
  13.     bl_label= "children follow baba"
  14.     bl_options= {'REGISTER', 'UNDO'}
  15.    
  16.     def execute(self,context):
  17.         scene = bpy.context.scene
  18.         selObj = bpy.context.selected_objects
  19.         for sObj in selObj :
  20.             chldObj = sObj.children
  21.             slays = sObj.layers
  22.             for cObj in chldObj :
  23.                 cObj.layers = slays
  24.         return {'FINISHED'}

  25. class DrawTypeWire(bpy.types.Operator):
  26.     bl_idname= "object.dtwire"
  27.     bl_label= "children follow baba"
  28.     bl_options= {'REGISTER', 'UNDO'}
  29.    
  30.     def execute(self,context):
  31.         scene = bpy.context.scene
  32.         selObj = bpy.context.selected_objects
  33.         x = 0
  34.         ####
  35.         for sObj in selObj :
  36.             chldObj = sObj.children
  37.             if sObj.draw_type == 'WIRE':
  38.                 x += 1
  39.             for cObj in chldObj :
  40.                 if cObj.draw_type == 'WIRE':
  41.                     x += 1
  42.                
  43.         if x == 0:
  44.             for sObj in selObj :
  45.                 chldObj = sObj.children
  46.                 sObj.draw_type = 'WIRE'
  47.                 for cObj in chldObj :
  48.                     cObj.draw_type = 'WIRE'
  49.         else:
  50.             for sObj in selObj :
  51.                 chldObj = sObj.children
  52.                 sObj.draw_type = 'TEXTURED'
  53.                 for cObj in chldObj :
  54.                     cObj.draw_type = 'TEXTURED'
  55.         return {'FINISHED'}
  56.    
  57. class DrawTypeBound(bpy.types.Operator):
  58.     bl_idname= "object.dtbound"
  59.     bl_label= "children follow baba"
  60.     bl_options= {'REGISTER', 'UNDO'}
  61.    
  62.     def execute(self,context):
  63.         scene = bpy.context.scene
  64.         selObj = bpy.context.selected_objects
  65.         x = 0
  66.         ####
  67.         for sObj in selObj :
  68.             chldObj = sObj.children
  69.             if sObj.draw_type == 'BOUNDS':
  70.                 x += 1
  71.             for cObj in chldObj :
  72.                 if cObj.draw_type == 'BOUNDS':
  73.                     x += 1
  74.                
  75.         if x == 0:
  76.             for sObj in selObj :
  77.                 chldObj = sObj.children
  78.                 sObj.draw_type = 'BOUNDS'
  79.                 for cObj in chldObj :
  80.                     cObj.draw_type = 'BOUNDS'
  81.         else:
  82.             for sObj in selObj :
  83.                 chldObj = sObj.children
  84.                 sObj.draw_type = 'TEXTURED'
  85.                 for cObj in chldObj :
  86.                     cObj.draw_type = 'TEXTURED'
  87.         return {'FINISHED'}
  88.    
  89. class ShowWire(bpy.types.Operator):
  90.     bl_idname= "object.swire"
  91.     bl_label= "children follow baba"
  92.     bl_options= {'REGISTER', 'UNDO'}
  93.    
  94.     def execute(self,context):
  95.         scene = bpy.context.scene
  96.         selObj = bpy.context.selected_objects
  97.         x = 0
  98.         ####
  99.         for sObj in selObj :
  100.             chldObj = sObj.children
  101.             if sObj.show_wire == True:
  102.                 x += 1
  103.             for cObj in chldObj :
  104.                 if cObj.show_wire == True:
  105.                     x += 1
  106.                
  107.         if x == 0:
  108.             for sObj in selObj :
  109.                 chldObj = sObj.children
  110.                 sObj.show_wire = True
  111.                 for cObj in chldObj :
  112.                     cObj.show_wire = True
  113.         else:
  114.             for sObj in selObj :
  115.                 chldObj = sObj.children
  116.                 sObj.show_wire = False
  117.                 for cObj in chldObj :
  118.                     cObj.show_wire = False
  119.         return {'FINISHED'}
  120.    
  121. class ShowAllEdges(bpy.types.Operator):
  122.     bl_idname= "object.showedges"
  123.     bl_label= "children follow baba"
  124.     bl_options= {'REGISTER', 'UNDO'}
  125.    
  126.     def execute(self,context):
  127.         scene = bpy.context.scene
  128.         selObj = bpy.context.selected_objects
  129.         x = 0
  130.         ####
  131.         for sObj in selObj :
  132.             chldObj = sObj.children
  133.             if sObj.show_all_edges == True:
  134.                 x += 1
  135.             for cObj in chldObj :
  136.                 if cObj.show_all_edges == True:
  137.                     x += 1
  138.                
  139.         if x == 0:
  140.             for sObj in selObj :
  141.                 chldObj = sObj.children
  142.                 sObj.show_all_edges = True
  143.                 for cObj in chldObj :
  144.                     cObj.show_all_edges = True
  145.         else:
  146.             for sObj in selObj :
  147.                 chldObj = sObj.children
  148.                 sObj.show_all_edges = False
  149.                 for cObj in chldObj :
  150.                     cObj.show_all_edges = False
  151.         return {'FINISHED'}

  152. class draw(bpy.types.Panel):
  153.     bl_category = 'Jianzwan'
  154.     bl_idname = "object.drawdisplay"
  155.     bl_label = "[v]display_Tool"
  156.     bl_space_type = 'VIEW_3D'
  157.     bl_region_type = 'TOOLS'
  158.    
  159.     def draw(self, context):
  160.         layout = self.layout
  161.         col = layout.column()
  162.         col.operator("object.layer",text='layers子从父')
  163.         box = col.box()
  164.         row = box.row(align=True)
  165.         row.operator("object.dtwire",text='dtWire子从父')
  166.         row.operator("object.dtbound",text='dtBound子从父')
  167.         box = col.box()
  168.         row = box.row(align=True)
  169.         row.operator("object.swire",text='sWire子从父')
  170.         row.operator("object.showedges",text='sEdges子从父')
  171.         
  172. def register():
  173.     bpy.utils.register_class(ControlChildLayers)
  174.     bpy.utils.register_class(DrawTypeWire)
  175.     bpy.utils.register_class(DrawTypeBound)
  176.     bpy.utils.register_class(ShowWire)
  177.     bpy.utils.register_class(ShowAllEdges)
  178.     bpy.utils.register_class(draw)
  179.    
  180. def unregister():
  181.     bpy.utils.unregister_class(ControlChildLayers)
  182.     bpy.utils.unregister_class(DrawTypeWire)
  183.     bpy.utils.unregister_class(DrawTypeBound)
  184.     bpy.utils.unregister_class(ShowWire)
  185.     bpy.utils.unregister_class(ShowAllEdges)
  186.     bpy.utils.unregister_class(draw)
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 12:04:33 | 显示全部楼层
生成齿轮 有细
part 1
  1. bl_info = {
  2.     "name": "[v]Gear_J",
  3.     'author':'Jianzwan',
  4.     'version':(1,0),
  5.     "blender":(2,75,0),
  6.     "location":'View3D > spacebar > search gear_J',
  7.     "description": "create subdivision gear",
  8.     "category": "Jianzwan",
  9. }
  10. import bpy,math
  11. import bmesh

  12. def addgearJ(inRadius,midRadius,toothedRadius1,toothedRadius2,toothed,sIToothed,sOToothed,toothesScale,toothesOutScale1,toothesOutScale2,height,mtHeight,tHeight):
  13.     outRadius1 = toothedRadius1 + midRadius
  14.     outRadius2 = outRadius1 +toothedRadius2
  15.     mtHeight1 = (height-tHeight)*toothedRadius2/(toothedRadius1+toothedRadius2) + tHeight
  16.     height2 = height/2
  17.     tHeight2 = tHeight/2
  18.     mtHeight1 = mtHeight1/2*mtHeight
  19.     dgs = math.radians(360/toothed/2) #degrees out

  20.     subODgs = toothesScale*dgs/sOToothed
  21.     subIDgs = (2-toothesScale)*dgs/sIToothed

  22.     scene = bpy.context.scene
  23.     nM = bpy.data.meshes.new('nGearM')
  24.     nGBM = bmesh.new()
  25.     ##create verts
  26.     for i in range(toothed*2):
  27.         tos = ((1 - toothesOutScale1)/2 )*dgs   #toothed out offset
  28.         tos2 = ((1 - toothesOutScale2)/2 )*dgs
  29.         if i % 2 == 0 :
  30.             dgsOut2 = (i*dgs)+tos*toothesScale
  31.             dgsOut4 = (i*dgs)+tos2*toothesScale
  32.             a = i*dgs
  33.             xic = math.sin(a)*inRadius
  34.             yic = math.cos(a)*inRadius
  35.             xmc = math.sin(a)*midRadius
  36.             ymc = math.cos(a)*midRadius
  37.             
  38.             xoc1 = math.sin(dgsOut2)*outRadius1
  39.             yoc1 = math.cos(dgsOut2)*outRadius1
  40.             
  41.             xoc2 = math.sin(dgsOut4)*outRadius2
  42.             yoc2 = math.cos(dgsOut4)*outRadius2
  43.             
  44.             nV = nGBM.verts.new()
  45.             nV.co = (xic,yic,height2)
  46.             nV = nGBM.verts.new()
  47.             nV.co = (xmc,ymc,height2)
  48.             nV = nGBM.verts.new()
  49.             nV.co = (xoc1,yoc1,mtHeight1)
  50.             nV = nGBM.verts.new()
  51.             nV.co = (xoc2,yoc2,tHeight2)
  52.             
  53.             nV = nGBM.verts.new()
  54.             nV.co = (xoc2,yoc2,-tHeight2)
  55.             nV = nGBM.verts.new()
  56.             nV.co = (xoc1,yoc1,-mtHeight1)
  57.             nV = nGBM.verts.new()
  58.             nV.co = (xmc,ymc,-height2)
  59.             nV = nGBM.verts.new()
  60.             nV.co = (xic,yic,-height2)
  61.             
  62.             if sOToothed >= 2:
  63.                 for i1 in range(1,sOToothed):
  64.                     b = a + subODgs*i1
  65.                     xic = math.sin(b)*inRadius
  66.                     yic = math.cos(b)*inRadius
  67.                     xmc = math.sin(b)*midRadius
  68.                     ymc = math.cos(b)*midRadius
  69.                     b = dgsOut2 + subODgs*i1*toothesOutScale1
  70.                     xoc1 = math.sin(b)*outRadius1
  71.                     yoc1 = math.cos(b)*outRadius1
  72.                     b = dgsOut4 + subODgs*i1*toothesOutScale2
  73.                     xoc2 = math.sin(b)*outRadius2
  74.                     yoc2 = math.cos(b)*outRadius2
  75.                     
  76.                     nV = nGBM.verts.new()
  77.                     nV.co = (xic,yic,height2)
  78.                     nV = nGBM.verts.new()
  79.                     nV.co = (xmc,ymc,height2)
  80.                     nV = nGBM.verts.new()
  81.                     nV.co = (xoc1,yoc1,mtHeight1)
  82.                     nV = nGBM.verts.new()
  83.                     nV.co = (xoc2,yoc2,tHeight2)
  84.                     
  85.                     nV = nGBM.verts.new()
  86.                     nV.co = (xoc2,yoc2,-tHeight2)
  87.                     nV = nGBM.verts.new()
  88.                     nV.co = (xoc1,yoc1,-mtHeight1)
  89.                     nV = nGBM.verts.new()
  90.                     nV.co = (xmc,ymc,-height2)
  91.                     nV = nGBM.verts.new()
  92.                     nV.co = (xic,yic,-height2)
  93.                     
  94.                     
  95.         else :
  96.             dgsOut3 = (i*dgs)-tos*toothesScale+dgs*(toothesScale-1)
  97.             dgsOut5 = (i*dgs)-tos2*toothesScale+dgs*(toothesScale-1)
  98.             a = i*dgs+dgs*(toothesScale-1)
  99.             xic = math.sin(a)*inRadius
  100.             yic = math.cos(a)*inRadius
  101.             xmc = math.sin(a)*midRadius
  102.             ymc = math.cos(a)*midRadius
  103.             
  104.             xoc1 = math.sin(dgsOut3)*outRadius1
  105.             yoc1 = math.cos(dgsOut3)*outRadius1
  106.             
  107.             xoc2 = math.sin(dgsOut5)*outRadius2
  108.             yoc2 = math.cos(dgsOut5)*outRadius2
  109.             
  110.             nV = nGBM.verts.new()
  111.             nV.co = (xic,yic,height2)
  112.             nV = nGBM.verts.new()
  113.             nV.co = (xmc,ymc,height2)
  114.             nV = nGBM.verts.new()
  115.             nV.co = (xoc1,yoc1,mtHeight1)
  116.             nV = nGBM.verts.new()
  117.             nV.co = (xoc2,yoc2,tHeight2)
  118.             
  119.             nV = nGBM.verts.new()
  120.             nV.co = (xoc2,yoc2,-tHeight2)
  121.             nV = nGBM.verts.new()
  122.             nV.co = (xoc1,yoc1,-mtHeight1)
  123.             nV = nGBM.verts.new()
  124.             nV.co = (xmc,ymc,-height2)
  125.             nV = nGBM.verts.new()
  126.             nV.co = (xic,yic,-height2)
  127.             
  128.             for li in range(1,sIToothed):     #subdivision
  129.                 b = a + subIDgs*li
  130.                 xic = math.sin(b)*inRadius
  131.                 yic = math.cos(b)*inRadius
  132.                 xmc = math.sin(b)*midRadius
  133.                 ymc = math.cos(b)*midRadius
  134.                
  135.                 nV = nGBM.verts.new()
  136.                 nV.co = (xic,yic,height2)
  137.                 nV = nGBM.verts.new()
  138.                 nV.co = (xmc,ymc,height2)
  139.                 nV = nGBM.verts.new()
  140.                 nV.co = (xmc,ymc,-height2)
  141.                 nV = nGBM.verts.new()
  142.                 nV.co = (xic,yic,-height2)
  143.                
  144.     nGBM.verts.ensure_lookup_table()
  145.     ##ceate poly
  146.     for i in range(toothed):
  147.         for si in range(sOToothed):
  148.             s = i*8*(sOToothed+1)+i*4*(sIToothed-1)+si*8
  149.             e = s + 8-1
  150.             for a in range(s,e): #toothed face
  151.                 print(i,si,s,e,a)
  152.                 verts = [nGBM.verts[a],nGBM.verts[a+8],nGBM.verts[a+9],nGBM.verts[a+1]]
  153.                 nGBM.faces.new(verts)
  154.         s = i*8*(sOToothed+1)+i*4*(sIToothed-1)
  155.         verts = [nGBM.verts[s+1],nGBM.verts[s+2],nGBM.verts[s+5],nGBM.verts[s+6]]
  156.         nGBM.faces.new(verts)
  157.         verts = [nGBM.verts[s+2],nGBM.verts[s+3],nGBM.verts[s+4],nGBM.verts[s+5]]
  158.         nGBM.faces.new(verts)
  159.         s1 = e + 1      #first face behind toothed
  160.         s2 = s1+6       #first back face behind toothed
  161.         s3 = s1 +8 +(sIToothed-2)*4
  162.         s4 = s3 +2
  163.         verts = [nGBM.verts[s1+1],nGBM.verts[s1+6],nGBM.verts[s1+5],nGBM.verts[s1+2]]
  164.         nGBM.faces.new(verts)
  165.         verts = [nGBM.verts[s1+2],nGBM.verts[s1+5],nGBM.verts[s1+4],nGBM.verts[s1+3]]
  166.         nGBM.faces.new(verts)
  167.         
  168.         if sIToothed >1:   #in subdivision >1
  169.             print(s1,s2)
  170.             verts = [nGBM.verts[s1],nGBM.verts[s1+8],nGBM.verts[s1+9],nGBM.verts[s1+1]]
  171.             nGBM.faces.new(verts)
  172.             verts = [nGBM.verts[s1+1],nGBM.verts[s1+9],nGBM.verts[s1+10],nGBM.verts[s1+6]]
  173.             nGBM.faces.new(verts)
  174.             verts = [nGBM.verts[s2],nGBM.verts[s2+4],nGBM.verts[s2+5],nGBM.verts[s2+1]]
  175.             nGBM.faces.new(verts)
  176.             ##
  177.             if i == (toothed-1):#in subdivision >1,cycle's end
  178.                 print(s3)
  179.                 verts = [nGBM.verts[s3],nGBM.verts[0],nGBM.verts[1],nGBM.verts[s3+1]]
  180.                 nGBM.faces.new(verts)
  181.                 verts = [nGBM.verts[s3+1],nGBM.verts[1],nGBM.verts[6],nGBM.verts[s3+2]]
  182.                 nGBM.faces.new(verts)
  183.                 verts = [nGBM.verts[s4],nGBM.verts[6],nGBM.verts[7],nGBM.verts[s4+1]]
  184.                 nGBM.faces.new(verts)
  185.             else:#in subdivision >1,not cycle's end
  186.                 verts = [nGBM.verts[s3],nGBM.verts[s3+4],nGBM.verts[s3+5],nGBM.verts[s3+1]]
  187.                 nGBM.faces.new(verts)
  188.                 verts = [nGBM.verts[s3+1],nGBM.verts[s3+5],nGBM.verts[s3+10],nGBM.verts[s3+2]]
  189.                 nGBM.faces.new(verts)
  190.                 verts = [nGBM.verts[s4],nGBM.verts[s4+8],nGBM.verts[s4+9],nGBM.verts[s4+1]]
  191.                 nGBM.faces.new(verts)
  192.             if sIToothed >2:
  193.                 for si in range(0,sIToothed-2):
  194.                     s3 = s1 +8 +si*4
  195.                     verts = [nGBM.verts[s3],nGBM.verts[s3+4],nGBM.verts[s3+5],nGBM.verts[s3+1]]
  196.                     nGBM.faces.new(verts)
  197.                     verts = [nGBM.verts[s3+1],nGBM.verts[s3+5],nGBM.verts[s3+6],nGBM.verts[s3+2]]
  198.                     nGBM.faces.new(verts)
  199.                     verts = [nGBM.verts[s3+2],nGBM.verts[s3+6],nGBM.verts[s3+7],nGBM.verts[s3+3]]
  200.                     nGBM.faces.new(verts)
  201.         elif i == (toothed-1):  #subdivision=1,toothed's cycle's end
  202.             verts = [nGBM.verts[s1],nGBM.verts[0],nGBM.verts[1],nGBM.verts[s1+1]]
  203.             nGBM.faces.new(verts)
  204.             verts = [nGBM.verts[s1+1],nGBM.verts[1],nGBM.verts[6],nGBM.verts[s1+6]]
  205.             nGBM.faces.new(verts)
  206.             verts = [nGBM.verts[s2],nGBM.verts[6],nGBM.verts[7],nGBM.verts[s2+1]]
  207.             nGBM.faces.new(verts)
  208.         else:  ##subdivision=1,not cycle's end
  209.             verts = [nGBM.verts[s1],nGBM.verts[s1+8],nGBM.verts[s1+9],nGBM.verts[s1+1]]
  210.             nGBM.faces.new(verts)
  211.             verts = [nGBM.verts[s1+1],nGBM.verts[s1+9],nGBM.verts[s1+14],nGBM.verts[s1+6]]
  212.             nGBM.faces.new(verts)
  213.             verts = [nGBM.verts[s2],nGBM.verts[s2+8],nGBM.verts[s2+9],nGBM.verts[s2+1]]
  214.             nGBM.faces.new(verts)

  215.     nGBM.to_mesh(nM)
  216.     nGearO = bpy.data.objects.new('gear',nM)
  217.     scene.objects.link(nGearO)
  218.     nGearO.location = scene.cursor_location
  219.     scene.objects.active = nGearO
复制代码



回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 12:05:08 | 显示全部楼层
part 2
  1. class GearJ(bpy.types.Operator):
  2.     bl_idname= "object.gearj"
  3.     bl_label= "Gear_J"
  4.     bl_options= {'REGISTER', 'UNDO','PRESET'}
  5.    
  6.     inRadius = bpy.props.FloatProperty(name="inRadius", unit='LENGTH',default=1.0)
  7.     midRadius = bpy.props.FloatProperty(name="midRadius", unit='LENGTH',default=2.0)
  8.     toothedRadius1 = bpy.props.FloatProperty(name="toothedRadius1", unit='LENGTH',default=0.6)
  9.     toothedRadius2 = bpy.props.FloatProperty(name="toothedRadius2", unit='LENGTH',default=0.4)
  10.     toothed = bpy.props.IntProperty(name="toothed", default=8,min=1)
  11.     sIToothed = bpy.props.IntProperty(name="sIToothed", default=2,min=1)   #subdivision in
  12.     sOToothed = bpy.props.IntProperty(name="sOToothed", default=2,min=1)   #subdivision toothed
  13.     toothesScale = bpy.props.FloatProperty(name="toothesScale", unit='LENGTH',default=1.0)
  14.     toothesOutScale1 = bpy.props.FloatProperty(name="toothesOutScale1", unit='LENGTH',default=1.0)
  15.     toothesOutScale2 = bpy.props.FloatProperty(name="toothesOutScale2", unit='LENGTH',default=1.0)
  16.     height = bpy.props.FloatProperty(name="height", unit='LENGTH',default=1.0)
  17.     mtHeight = bpy.props.FloatProperty(name="mtHeight", unit='LENGTH',default=1.0)
  18.     tHeight = bpy.props.FloatProperty(name="tHeight", unit='LENGTH',default=0.4)
  19.    
  20.     def draw(self, context):
  21.         layout = self.layout
  22.         box = layout.box()
  23.         box.prop(self, 'toothed')
  24.         box.prop(self, 'toothesScale')
  25.         box = layout.box()
  26.         box.prop(self, 'inRadius')
  27.         box.prop(self, 'midRadius')
  28.         box.prop(self, 'height')
  29.         box = layout.box()
  30.         box.prop(self, 'toothedRadius1')
  31.         box.prop(self, 'sIToothed',text='subdivision')
  32.         box.prop(self, 'toothesOutScale1')
  33.         box.prop(self, 'mtHeight')
  34.         box = layout.box()
  35.         box.prop(self, 'toothedRadius2')
  36.         box.prop(self, 'sOToothed',text='subdivision')
  37.         box.prop(self, 'toothesOutScale2')
  38.         box.prop(self, 'tHeight')
  39.    
  40.     def execute(self,context):
  41.         addgearJ(self.inRadius,self.midRadius,self.toothedRadius1,self.toothedRadius2,self.toothed,self.sIToothed,self.sOToothed,self.toothesScale,self.toothesOutScale1,self.toothesOutScale2,self.height,self.mtHeight,self.tHeight)
  42.         #nGearO.select = True
  43.         return {'FINISHED'}
  44.    
  45. def menu_func(self, context):
  46.     self.layout.operator(ObjectCursorArray.bl_idname)

  47.         
  48. def register():
  49.     bpy.utils.register_class(GearJ)
  50.     bpy.types.VIEW3D_MT_object.append(menu_func)
  51.    
  52. def unregister():
  53.     bpy.utils.unregister_class(GearJ)
复制代码



回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2019-8-26 03:01 , Processed in 0.032073 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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