-
-
Save retsyo/47b19ee36916caa715569e5cfcca4fb7 to your computer and use it in GitHub Desktop.
blender用アドオン
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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