Skip to content

Instantly share code, notes, and snippets.

@retsyo
Forked from nedrops/duplicate_tools.py
Created April 23, 2018 02:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save retsyo/47b19ee36916caa715569e5cfcca4fb7 to your computer and use it in GitHub Desktop.
Save retsyo/47b19ee36916caa715569e5cfcca4fb7 to your computer and use it in GitHub Desktop.
blender用アドオン
bl_info = {
"name": "Duplicate Tools",
"author": "kuku",
"version": (1, 0),
"blender": (2, 79, 0),
"description": "Duplicate and fit to the face",
"support": "TESTING",
"category": "Object"
}
import bpy
import bmesh
import math
def instance(obj):
instance_object = bpy.data.objects.new(obj.name, obj.data)
bpy.context.scene.objects.link(instance_object)
return instance_object
def vec(x,y):
rz2=55
if x==0:
rz=math.pi/2
else:
rz=math.atan(y/x)
if x<0 or (x==0 and y<0):
rz=rz+math.pi
return rz
def building(unitMesh,MeshORLamp):
motoObj=bpy.context.object
motoMesh=motoObj.data
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)####
bpy.ops.object.select_all(action='DESELECT')
motoObj.select=True
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
bpy.ops.mesh.select_mode(type='FACE')
bm=bmesh.from_edit_mesh(motoMesh)
list=[i for i in bm.faces if i.select==True]
for i in list:
face=i
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
bpy.ops.mesh.select_all(action='DESELECT')
bm=bmesh.from_edit_mesh(motoMesh)
face.select=True
if bpy.context.scene.replace==False:
bpy.ops.mesh.duplicate()
bpy.ops.mesh.separate(type='SELECTED')
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
sepObjList=[x for x in bpy.context.selected_objects if not x==motoObj]
sepObjList.sort(key=lambda x:x.name)
bpy.ops.object.empty_add(type='CUBE',location=[0,0,0])
empObj=bpy.context.object
empObj.name='Empty-'+unitMesh.name
for j in sepObjList:
nor=j.data.polygons[0].normal
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
print(nor)
rz=-vec(nor[0],nor[1])-math.pi/2
j.rotation_euler=[0,0,rz]
bpy.ops.object.select_all(action='DESELECT')
j.select=True
bpy.ops.object.scale_clear()
bpy.ops.object.location_clear()
bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
nor2=j.data.polygons[0].normal
print(nor2)
rx=-vec(nor2[1],nor2[2])+math.pi/2
j.rotation_euler=[rx,0,0]
bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
j.rotation_euler=[-rx,0,-rz]
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='BOUNDS')
rot=j.rotation_euler
loc=j.location
bpy.ops.object.select_all(action='DESELECT')
unitObject=bpy.data.objects.new(unitMesh.name, unitMesh)
bpy.context.scene.objects.link(unitObject)
unitObject.select=True
ins=unitObject
ins.rotation_euler=rot
ins.location=loc
if MeshORLamp == 'Mesh':
dimX=j.dimensions[0]
dimY=j.dimensions[1]
dimZ=(dimX/ins.dimensions[1])*ins.dimensions[2]
ins.dimensions=[dimX,dimY,dimZ]
empObj.select=True
bpy.ops.object.parent_set()
bpy.ops.object.select_all(action='DESELECT')
j.select=True
bpy.ops.object.delete()
empObj.location=motoObj.location
empObj.rotation_euler=motoObj.rotation_euler
empObj.scale=motoObj.scale
class buildingMeshOperator(bpy.types.Operator):
bl_idname = "object.building_mesh_operator"
bl_label = "Building Mesh Operator"
def execute(self, context):
building(bpy.data.meshes[context.scene.mesh],'Mesh')
return {'FINISHED'}
class buildingLampOperator(bpy.types.Operator):
bl_idname = "object.building_lamp_operator"
bl_label = "Building Lamp Operator"
def execute(self, context):
building(bpy.data.lamps[context.scene.lamp],'Lamp')
return {'FINISHED'}
class AddonPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "Duplicate Tool"
bl_idname = "OBJECT_PT_Tools"
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
bl_context = "mesh_edit"
bl_category='Misc'
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row(align=True)
row.label(text="Duplicate Tools", icon='MESH_CUBE')
row = layout.row(align=True)
row.prop(context.scene, "replace",text="Replace")
row = layout.row(align=True)
row.prop_search(context.scene, "mesh", bpy.data, "meshes")
row = layout.row(align=True)
row.operator(buildingMeshOperator.bl_idname,text='Duplicate Mesh')
row = layout.row(align=True)
row.prop_search(context.scene, "lamp", bpy.data, "lamps")
row = layout.row(align=True)
row.operator(buildingLampOperator.bl_idname,text='Duplicate Lamp')
row = layout.row(align=True)
def register():
print("register")
bpy.utils.register_class(AddonPanel)
bpy.utils.register_class(buildingMeshOperator)
bpy.utils.register_class(buildingLampOperator)
bpy.types.Scene.mesh=bpy.props.StringProperty()
bpy.types.Scene.lamp=bpy.props.StringProperty()
bpy.types.Scene.replace=bpy.props.BoolProperty()
def unregister():
print("unregister")
bpy.utils.unregister_class(AddonPanel)
bpy.utils.unregister_class(buildingMeshOperator)
bpy.utils.unregister_class(buildingLampOperator)
del bpy.types.Scene.mesh
del bpy.types.Scene.lamp
del bpy.types.Scene.replace
if __name__ == "__main__":
register()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment