Last active
July 6, 2019 17:33
-
-
Save nedrops/70a60476df422f3d375358820438f5ba to your computer and use it in GitHub Desktop.
blender用アドオン
This file contains 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