Last active
July 15, 2018 11:03
-
-
Save nedrops/e32e4b158f5729b197fdf6574bba92b9 to your computer and use it in GitHub Desktop.
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": "N Tools", | |
| "author": "kuku", | |
| "version": (2, 1), | |
| "blender": (2, 79, 0), | |
| "description": "Duplicate Tools, Auto Connect and Cut With Planes", | |
| "support": "TESTING", | |
| "category": "Object" | |
| } | |
| import bpy | |
| import bmesh | |
| import math | |
| from operator import itemgetter | |
| import random | |
| #import datetime | |
| ###### Duplicate Tools Function ########################################################################## | |
| 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,replaceBool): | |
| 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 replaceBool==False: | |
| bpy.ops.mesh.duplicate() | |
| bpy.ops.mesh.separate(type='SELECTED') | |
| print(face)###################### | |
| 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 | |
| unitObject=bpy.data.objects.new(unitMesh.name, unitMesh) | |
| ins=unitObject | |
| ins.rotation_euler=rot | |
| ins.location=loc | |
| print('ins',ins)###################### | |
| if MeshORLamp == 'Mesh': | |
| dimX=j.dimensions[0] | |
| dimY=j.dimensions[1] | |
| dimZ=(dimX/ins.dimensions[1])*ins.dimensions[2] | |
| ins.dimensions=[dimX,dimY,dimZ] | |
| bpy.context.scene.objects.link(unitObject) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| unitObject.select=True | |
| bpy.context.scene.objects.active=empObj | |
| 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 | |
| ###### Auto Connect Function ########################################################################## | |
| def contactJudgment(ObjectA,ObjectB,Margin,Threshold,Distance): | |
| FaceLen=len(ObjectA.data.polygons)+len(ObjectB.data.polygons) | |
| VertexLen=len(ObjectA.data.vertices)+len(ObjectB.data.vertices) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| ObjectA.select=True | |
| bpy.ops.object.duplicate() | |
| ObjectADup=bpy.context.selected_objects[0] | |
| bpy.context.scene.objects.active=ObjectADup | |
| #Dispalce Modifier | |
| if Margin > 0: | |
| bpy.ops.object.modifier_add(type='DISPLACE') | |
| DisplaceModi=ObjectADup.modifiers[-1] | |
| DisplaceModi.mid_level=0 | |
| DisplaceModi.direction='NORMAL' | |
| DisplaceModi.strength=Margin | |
| bpy.ops.object.modifier_apply(apply_as='DATA', modifier=DisplaceModi.name) | |
| #Boolean Modifier | |
| bpy.ops.object.modifier_add(type='BOOLEAN') | |
| BoolModi=ObjectADup.modifiers[-1] | |
| BoolModi.object=ObjectB | |
| BoolModi.operation = 'UNION' | |
| BoolModi.double_threshold=Threshold | |
| bpy.ops.object.modifier_apply(apply_as='DATA', modifier=BoolModi.name) | |
| #Remove Doubles | |
| if Distance >= 0: | |
| bpy.ops.object.mode_set(mode='EDIT', toggle=False) | |
| BmeshObj=bmesh.from_edit_mesh(bpy.context.edit_object.data) | |
| bmesh.ops.remove_doubles(BmeshObj,verts=BmeshObj.verts,dist=Distance) | |
| bpy.ops.object.mode_set(mode='OBJECT', toggle=False) | |
| ############### | |
| ObjectADupFaceLen=len(ObjectADup.data.polygons) | |
| ObjectADupVertexLen=len(ObjectADup.data.vertices) | |
| bpy.ops.object.delete() | |
| print(ObjectADupFaceLen,ObjectADupVertexLen,FaceLen,VertexLen) | |
| return not [FaceLen,VertexLen]==[ObjectADupFaceLen,ObjectADupVertexLen] | |
| def connectObject(ObjectA,ObjectB): | |
| bpy.ops.object.select_all(action='DESELECT') | |
| #ObjectA.select=True | |
| #ObjectB.select=True | |
| #bpy.context.scene.objects.active=ObjectA | |
| #bpy.ops.rigidbody.connect(pivot_type='CENTER', connection_pattern='SELECTED_TO_ACTIVE') | |
| #Low Level RigidBody Connect | |
| name='Constraint-'+ObjectA.name+'-'+ObjectB.name | |
| Empty=bpy.data.objects.new(name,None) | |
| ObjectAWorldPosition=ObjectA.matrix_world.to_translation() | |
| ObjectBWorldPosition=ObjectB.matrix_world.to_translation() | |
| Empty.location.x=(ObjectAWorldPosition[0] + ObjectBWorldPosition[0])/2 | |
| Empty.location.y=(ObjectAWorldPosition[1] + ObjectBWorldPosition[1])/2 | |
| Empty.location.z=(ObjectAWorldPosition[2] + ObjectBWorldPosition[2])/2 | |
| bpy.context.scene.objects.link(Empty) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| bpy.context.scene.objects.active=Empty | |
| bpy.ops.rigidbody.constraint_add() | |
| Empty.rigid_body_constraint.object1 = ObjectA | |
| Empty.rigid_body_constraint.object2 = ObjectB | |
| print(ObjectA,ObjectB) | |
| def connectPairList(PairList): | |
| List=[] | |
| Empty=bpy.data.objects.new('Empty',None) | |
| bpy.context.scene.objects.link(Empty) | |
| bpy.context.scene.objects.active=Empty | |
| bpy.ops.rigidbody.constraint_add() | |
| for i in PairList: | |
| Obj=[j for j in i] | |
| ObjectA=Obj[0] | |
| ObjectB=Obj[1] | |
| Name='Constraint-'+ObjectA.name+'-'+ObjectB.name | |
| Joint=Empty.copy() | |
| Joint.name=Name | |
| ObjectAWorldPosition=ObjectA.matrix_world.to_translation() | |
| ObjectBWorldPosition=ObjectB.matrix_world.to_translation() | |
| Joint.location.x=(ObjectAWorldPosition[0] + ObjectBWorldPosition[0])/2 | |
| Joint.location.y=(ObjectAWorldPosition[1] + ObjectBWorldPosition[1])/2 | |
| Joint.location.z=(ObjectAWorldPosition[2] + ObjectBWorldPosition[2])/2 | |
| Joint.rigid_body_constraint.object1 = ObjectA | |
| Joint.rigid_body_constraint.object2 = ObjectB | |
| List.append((Empty,ObjectA,ObjectB)) | |
| bpy.context.scene.objects.link(Joint) | |
| bpy.context.scene.objects.active=Joint | |
| bpy.ops.object.group_link(group=bpy.context.scene.rigidbody_world.constraints.name) | |
| print(Name) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Empty.select=True | |
| bpy.ops.object.delete() | |
| def measure(first, second): | |
| x = second[0] - first[0] | |
| y = second[1] - first[1] | |
| z = second[2] - first[2] | |
| distance = math.sqrt(x**2+y**2+z**2) | |
| return distance | |
| def getNearest(Object,SearchObjectList,TopN): | |
| WorldPosition=Object.matrix_world.to_translation() | |
| DisDict=[(j,measure(WorldPosition,(j.matrix_world.to_translation()))) for j in SearchObjectList] | |
| SortedDisList=sorted(DisDict,key=itemgetter(1)) | |
| return SortedDisList[:TopN] | |
| def autoConnect(Margin,Threshold,Distance,SearchNumber): | |
| SelectedObjectList=[i for i in bpy.context.selected_objects if i.type=='MESH'] | |
| PairList=[] | |
| for ObjectA in SelectedObjectList: | |
| print(ObjectA) | |
| if ObjectA.rigid_body==None: | |
| bpy.ops.object.select_all(action='DESELECT') | |
| ObjectA.select=True | |
| bpy.context.scene.objects.active=ObjectA | |
| bpy.ops.rigidbody.objects_add(type='ACTIVE') | |
| SearchObjectList=SelectedObjectList.copy() | |
| SearchObjectList.remove(ObjectA) | |
| NearestObjectList=getNearest(ObjectA,SearchObjectList,SearchNumber) | |
| for ObjectBTuple in NearestObjectList: | |
| ObjectB=ObjectBTuple[0] | |
| if {ObjectA,ObjectB} not in PairList and contactJudgment(ObjectA,ObjectB,Margin,Threshold,Distance): | |
| PairList.append({ObjectA,ObjectB}) | |
| connectPairList(PairList) | |
| def selectDuplicateJoint(): | |
| bpy.ops.object.select_all(action='SELECT') | |
| SelectedObjectList=bpy.context.selected_objects | |
| bpy.ops.object.select_all(action='DESELECT') | |
| for i,Joint in enumerate(SelectedObjectList): | |
| if Joint.rigid_body_constraint==None: | |
| break | |
| ObjectSet={Joint.rigid_body_constraint.object1 , Joint.rigid_body_constraint.object2} | |
| for SearchJoint in SelectedObjectList[i+1:]: | |
| if SearchJoint.rigid_body_constraint==None: | |
| break | |
| SearchObjectSet={SearchJoint.rigid_body_constraint.object1 , SearchJoint.rigid_body_constraint.object2} | |
| if ObjectSet==SearchObjectSet: | |
| SearchJoint.select=True | |
| ###### Cut With Plane Function ########################################################################## | |
| def cutWithPlane(Target,Plane,Margin,ExtrudeVector): | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Target.select=True | |
| bpy.ops.object.duplicate() | |
| TargetDup=bpy.context.selected_objects[0] | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Plane.select=True | |
| bpy.ops.object.duplicate() | |
| PlaneDup=bpy.context.selected_objects[0] | |
| bpy.context.scene.objects.active=PlaneDup | |
| bpy.ops.object.mode_set(mode='EDIT', toggle=False) | |
| bpy.ops.mesh.select_all(action='SELECT') | |
| bpy.ops.mesh.extrude_region_move( | |
| MESH_OT_extrude_region={"mirror":False}, | |
| TRANSFORM_OT_translate={ | |
| "value":(0, 0, ExtrudeVector), | |
| "constraint_orientation":'NORMAL', | |
| "constraint_axis":(False,False,True) } ) | |
| bpy.ops.object.mode_set(mode='OBJECT', toggle=False) | |
| ############################################ | |
| def cutBoolean(TargetDup,PlaneDup,Strength,Operation): | |
| #'DIFFERENCE'or'INTERSECT' | |
| if Margin > 0: | |
| bpy.context.scene.objects.active=PlaneDup | |
| bpy.ops.object.modifier_add(type='DISPLACE') | |
| PlaneModi=PlaneDup.modifiers[-1] | |
| PlaneModi.mid_level=0 | |
| PlaneModi.direction='NORMAL' | |
| PlaneModi.strength=Strength | |
| bpy.context.scene.objects.active=TargetDup | |
| bpy.ops.object.modifier_add(type='BOOLEAN') | |
| TargetModi=TargetDup.modifiers[-1] | |
| TargetModi.solver = 'BMESH' | |
| TargetModi.object = PlaneDup | |
| TargetModi.operation = Operation | |
| bpy.ops.object.modifier_apply(apply_as='DATA', modifier=TargetModi.name) | |
| if Margin > 0: | |
| bpy.context.scene.objects.active=PlaneDup | |
| bpy.ops.object.modifier_remove(modifier=PlaneModi.name) | |
| ############################################ | |
| cutBoolean(Target,PlaneDup, Margin/2,'DIFFERENCE') | |
| cutBoolean(TargetDup,PlaneDup,-Margin/2,'INTERSECT') | |
| bpy.ops.object.select_all(action='DESELECT') | |
| PlaneDup.select=True | |
| bpy.ops.object.delete() | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Target.select=True | |
| TargetDup.select=True | |
| bpy.context.scene.objects.active=Target | |
| bpy.ops.object.join() | |
| print(Target,Plane,Margin) | |
| def getDiagonal(Object): | |
| Dim=Object.dimensions | |
| Diagonal=math.sqrt(Dim[0]**2+Dim[1]**2+Dim[2]**2) | |
| return Diagonal | |
| def cutWithPlanes(Margin): | |
| Active=bpy.context.scene.objects.active | |
| PlaneList=bpy.context.selected_objects | |
| PlaneList.remove(Active) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Active.select=True | |
| bpy.ops.object.duplicate() | |
| Target=bpy.context.selected_objects[0] | |
| Name=Active.name+'-cell.000' | |
| Target.name=Name | |
| GroupName='Group-'+Name | |
| bpy.ops.group.create(name=GroupName) | |
| ExtrudeVector=getDiagonal(Target) | |
| for Plane in PlaneList: | |
| print(Target,Plane) | |
| cutWithPlane(Target,Plane,Margin,ExtrudeVector) | |
| bpy.context.scene.objects.active=Target | |
| Target.select=True | |
| bpy.ops.mesh.separate(type='LOOSE') | |
| bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN') | |
| def createPlane(NumberOfPlane,FirstSubdivide=5,FirstFractal=1.0,SecondSubdivide=5,SecondFractal=1.0,SmoothFactor=1.0,SmoothRepeat=1,CenterOrLine='Line'): | |
| Target=bpy.context.scene.objects.active | |
| ##get center | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Target.select=True | |
| bpy.ops.object.duplicate() | |
| bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='BOUNDS') | |
| TargetDup=bpy.context.scene.objects.active | |
| CenterLocation=TargetDup.matrix_world.to_translation() | |
| CenterRotation=TargetDup.matrix_world.to_euler() | |
| Dim=TargetDup.dimensions.copy() | |
| DimList=[i for i in Dim] | |
| LineLength=max(DimList) | |
| MaxAxis='XYZ'[DimList.index(LineLength)] | |
| Diagonal=getDiagonal(TargetDup) | |
| bpy.ops.object.delete() | |
| ## | |
| Radius=Diagonal/2 | |
| bpy.ops.mesh.primitive_plane_add(radius=Radius) | |
| PlaneOrigin=bpy.context.scene.objects.active | |
| PlaneName=Target.name+'CuttingPlane.000' | |
| PlaneOrigin.name=PlaneName | |
| GroupName='Group-'+PlaneName | |
| bpy.ops.group.create(name=GroupName) | |
| ### | |
| bpy.ops.object.empty_add() | |
| Empty=bpy.context.scene.objects.active | |
| Empty.name='Empty-'+PlaneName | |
| PlaneOrigin.select+=True | |
| bpy.ops.object.parent_no_inverse_set() | |
| for i in range(NumberOfPlane): | |
| bpy.ops.object.select_all(action='DESELECT') | |
| bpy.context.scene.objects.active=PlaneOrigin | |
| PlaneOrigin.select=True | |
| bpy.ops.object.duplicate()#_move_linked() | |
| PlaneDup=bpy.context.scene.objects.active | |
| ##EDIT | |
| bpy.ops.object.mode_set(mode='EDIT', toggle=False) | |
| bpy.ops.mesh.select_all(action='SELECT') | |
| bpy.ops.mesh.subdivide(number_cuts=FirstSubdivide, fractal=FirstFractal,seed=random.randint(0,255)) | |
| bpy.ops.mesh.subdivide(number_cuts=SecondSubdivide, fractal=SecondFractal,seed=random.randint(0,255)) | |
| bpy.ops.mesh.vertices_smooth(factor=SmoothFactor, repeat=SmoothRepeat) | |
| bpy.ops.object.mode_set(mode='OBJECT', toggle=False) | |
| #### | |
| if CenterOrLine=='Center': | |
| Ro=(math.pi/NumberOfPlane)*(i+1) | |
| PlaneDup.rotation_euler=[0,Ro,0] | |
| if CenterOrLine=='Line': | |
| PlaneDup.rotation_euler=[math.pi/2,0,0] | |
| Loc=LineLength/(NumberOfPlane+1)*(i+1)-LineLength/2 | |
| PlaneDup.location=[0,Loc,0] | |
| Empty.rotation_euler=CenterRotation | |
| Empty.location=CenterLocation | |
| print(MaxAxis) | |
| bpy.ops.object.select_all(action='DESELECT') | |
| Empty.select=True | |
| if MaxAxis=='X': | |
| bpy.ops.transform.rotate(value=-math.pi/2, constraint_axis=(False,False,True), constraint_orientation='LOCAL') | |
| if MaxAxis=='Y': | |
| bpy.ops.transform.rotate(value=-math.pi/2, constraint_axis=(False,True,False), constraint_orientation='LOCAL') | |
| if MaxAxis=='Z': | |
| bpy.ops.transform.rotate(value=-math.pi/2, constraint_axis=(True,False,False), constraint_orientation='LOCAL') | |
| bpy.ops.object.select_all(action='DESELECT') | |
| PlaneOrigin.select=True | |
| bpy.ops.object.delete() | |
| PlaneDup=bpy.context.scene.objects.active | |
| bpy.ops.object.select_grouped(type='GROUP') | |
| Target.select=True | |
| bpy.context.scene.objects.active=Target | |
| ###### Duplicate Tools Addon Setting ########################################################################## | |
| class OperatorBuildingMesh(bpy.types.Operator): | |
| bl_idname = "object.building_mesh_operator" | |
| bl_label = "Building Mesh Operator" | |
| def execute(self, context): | |
| building(bpy.data.meshes[context.scene.DuplicateToolsMesh],'Mesh',context.scene.DuplicateToolsReplace) | |
| return {'FINISHED'} | |
| class OperatorBuildingLamp(bpy.types.Operator): | |
| bl_idname = "object.building_lamp_operator" | |
| bl_label = "Building Lamp Operator" | |
| def execute(self, context): | |
| building(bpy.data.lamps[context.scene.DuplicateToolsLamp],'Lamp',context.scene.DuplicateToolsReplace) | |
| return {'FINISHED'} | |
| class AddonPanelDuplicateTool(bpy.types.Panel): | |
| """Creates a Panel in the Object properties window""" | |
| bl_label = "Duplicate Tool" | |
| bl_idname = "object.duplicate_tools_panel" | |
| bl_space_type = 'VIEW_3D' | |
| bl_region_type = 'TOOLS' | |
| bl_context = "mesh_edit" | |
| bl_category='N Tools' | |
| 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, "DuplicateToolsReplace",text="Replace") | |
| row = layout.row(align=True) | |
| row.prop_search(context.scene, "DuplicateToolsMesh", bpy.data, "meshes", text='Mesh') | |
| row = layout.row(align=True) | |
| row.operator(OperatorBuildingMesh.bl_idname,text='Duplicate Mesh') | |
| row = layout.row(align=True) | |
| row.prop_search(context.scene, "DuplicateToolsLamp", bpy.data, "lamps", text='Lamp') | |
| row = layout.row(align=True) | |
| row.operator(OperatorBuildingLamp.bl_idname,text='Duplicate Lamp') | |
| row = layout.row(align=True) | |
| ###### Auto Connect Addon Setting ########################################################################### | |
| class OperatorAutoConnect(bpy.types.Operator): | |
| bl_idname = "object.auto_connect_operator" | |
| bl_label = "Auto Connect Operator" | |
| def execute(self, context): | |
| Margin=bpy.context.scene.autoConnectMargin | |
| Threshold=bpy.context.scene.autoConnectThreshold | |
| SearchNumber= bpy.context.scene.autoConnectLimit | |
| Distance=bpy.context.scene.autoConnectDistance | |
| autoConnect(Margin,Threshold,Distance,SearchNumber) | |
| return {'FINISHED'} | |
| class OperatorSelectDuplicateJoint(bpy.types.Operator): | |
| bl_idname = "object.select_duplicate_joint_operator" | |
| bl_label = "Select Duplicate Joint Operator" | |
| def execute(self, context): | |
| selectDuplicateJoint() | |
| return {'FINISHED'} | |
| class AddonPanelAutoConnect(bpy.types.Panel): | |
| """Creates a Panel in the Object properties window""" | |
| bl_label = "Auto Connect" | |
| bl_idname = "object.auto_connect_panel" | |
| bl_space_type = 'VIEW_3D' | |
| bl_region_type = 'TOOLS' | |
| bl_context = "objectmode" | |
| bl_category='N Tools' | |
| def draw(self, context): | |
| layout = self.layout | |
| obj = context.object | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'autoConnectMargin',text='Margin') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'autoConnectThreshold',text='Threshold') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'autoConnectDistance',text='Distance') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'autoConnectLimit',text='Limit') | |
| row = layout.row(align=True) | |
| row.operator(OperatorAutoConnect.bl_idname,text='Auto Connect') | |
| row = layout.row(align=True) | |
| row.operator(OperatorSelectDuplicateJoint.bl_idname,text='Select Duplicate Joint') | |
| ###### Cut With Plane Addon Setting ########################################################################## | |
| class OperatorCutWithPlanes(bpy.types.Operator): | |
| bl_idname = "object.cut_with_planes_operator" | |
| bl_label = "Operator Cut With Planes" | |
| def execute(self, context): | |
| Margin=bpy.context.scene.CutWithPlanesMargin | |
| cutWithPlanes(Margin) | |
| return {'FINISHED'} | |
| class OperatorCreatePlanes(bpy.types.Operator): | |
| bl_idname = "object.create_planes_operator" | |
| bl_label = "Operator Create Planes" | |
| def execute(self, context): | |
| NumberOfPlane=bpy.context.scene.CutWithPlanesNumberOfPlanes | |
| FirstSubdivide=bpy.context.scene.CutWithPlanesFirstSubdivide | |
| FirstFractal=bpy.context.scene.CutWithPlanesFirstFractal | |
| CutWithPlanesSecondSubdivide=bpy.props.IntProperty(default=5,min=0) | |
| SecondSubdivide=bpy.context.scene.CutWithPlanesSecondSubdivide | |
| SecondFractal=bpy.context.scene.CutWithPlanesSecondFractal | |
| SmoothFactor=bpy.context.scene.CutWithPlanesSmoothFactor | |
| SmoothRepeat=bpy.context.scene.CutWithPlanesSmoothRepeat | |
| CenterOrLine=bpy.context.scene.CutWithPlanesCenterOrLine | |
| createPlane(NumberOfPlane,FirstSubdivide,FirstFractal,SecondSubdivide,SecondFractal,SmoothFactor,SmoothRepeat,CenterOrLine) | |
| return {'FINISHED'} | |
| class AddonPanelCutWithPlanes(bpy.types.Panel): | |
| """Creates a Panel in the Object properties window""" | |
| bl_label = "Cut With Planes" | |
| bl_idname = "object.cut_with_planes_panel" | |
| bl_space_type = 'VIEW_3D' | |
| bl_region_type = 'TOOLS' | |
| bl_context = "objectmode" | |
| bl_category='N Tools' | |
| def draw(self, context): | |
| layout = self.layout | |
| obj = context.object | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesMargin',text='Margin') | |
| row = layout.row(align=True) | |
| row.operator(OperatorCutWithPlanes.bl_idname,text='Cut With Planes') | |
| ######Create Planes | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesNumberOfPlanes',text='Planes') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesFirstSubdivide',text='1st Subdivide') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesFirstFractal',text='1st Fractal') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesSecondSubdivide',text='2nd Subdivide') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesSecondFractal',text='2nd Fractal') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesSmoothFactor',text='Smooth') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesSmoothRepeat',text='Smooth Repeat') | |
| row = layout.row(align=True) | |
| row.prop(context.scene,'CutWithPlanesCenterOrLine',expand=True) | |
| row = layout.row(align=True) | |
| row.operator(OperatorCreatePlanes.bl_idname,text='Create Planes') | |
| ###### Register ########################################################################### | |
| def register(): | |
| print("register") | |
| #bpy.utils.register_module(__name__) | |
| bpy.utils.register_class(AddonPanelDuplicateTool) | |
| bpy.utils.register_class(OperatorBuildingMesh) | |
| bpy.utils.register_class(OperatorBuildingLamp) | |
| bpy.types.Scene.DuplicateToolsMesh=bpy.props.StringProperty() | |
| bpy.types.Scene.DuplicateToolsLamp=bpy.props.StringProperty() | |
| bpy.types.Scene.DuplicateToolsReplace=bpy.props.BoolProperty() | |
| ### Auto Connect ### | |
| bpy.utils.register_class(AddonPanelAutoConnect) | |
| bpy.utils.register_class(OperatorAutoConnect) | |
| bpy.utils.register_class(OperatorSelectDuplicateJoint) | |
| bpy.types.Scene.autoConnectMargin=bpy.props.FloatProperty(default=0.01,min=0.0,max=10.0,step=1,precision=3) | |
| bpy.types.Scene.autoConnectThreshold=bpy.props.FloatProperty(default=0.01,min=0.0,max=1.0,step=1,precision=3) | |
| bpy.types.Scene.autoConnectDistance=bpy.props.FloatProperty(default=-1.0,min=-1.0,max=1.0,step=1,precision=3) | |
| bpy.types.Scene.autoConnectLimit=bpy.props.IntProperty(default=10,min=1) | |
| ### Cut With Plane ### | |
| bpy.utils.register_class(AddonPanelCutWithPlanes) | |
| bpy.utils.register_class(OperatorCutWithPlanes) | |
| bpy.utils.register_class(OperatorCreatePlanes) | |
| bpy.types.Scene.CutWithPlanesMargin=bpy.props.FloatProperty(default=0.0001,min=0,step=1,precision=4) | |
| bpy.types.Scene.CutWithPlanesNumberOfPlanes=bpy.props.IntProperty(default=1,min=1) | |
| bpy.types.Scene.CutWithPlanesFirstSubdivide=bpy.props.IntProperty(default=5,min=0) | |
| bpy.types.Scene.CutWithPlanesFirstFractal=bpy.props.FloatProperty(default=0.5,min=0,step=1,precision=3) | |
| bpy.types.Scene.CutWithPlanesSecondSubdivide=bpy.props.IntProperty(default=5,min=0) | |
| bpy.types.Scene.CutWithPlanesSecondFractal=bpy.props.FloatProperty(default=0.5,min=0,step=1,precision=3) | |
| bpy.types.Scene.CutWithPlanesSmoothFactor=bpy.props.FloatProperty(default=0,min=0.0,max=1.0,step=1,precision=3) | |
| bpy.types.Scene.CutWithPlanesSmoothRepeat=bpy.props.IntProperty(default=0,min=0) | |
| bpy.types.Scene.CutWithPlanesCenterOrLine=bpy.props.EnumProperty( | |
| name = "None", | |
| items = ( | |
| ('Line','Line','Line'),('Center','Center','Center') ) ) | |
| def unregister(): | |
| print("unregister") | |
| #bpy.utils.unregister_module(__name__) | |
| bpy.utils.unregister_class(AddonPanelDuplicateTool) | |
| bpy.utils.unregister_class(OperatorBuildingMesh) | |
| bpy.utils.unregister_class(OperatorBuildingLamp) | |
| del bpy.types.Scene.DuplicateToolsMesh | |
| del bpy.types.Scene.DuplicateToolsLamp | |
| del bpy.types.Scene.DuplicateToolsReplace | |
| ### Auto Connect ### | |
| bpy.utils.unregister_class(AddonPanelAutoConnect) | |
| bpy.utils.unregister_class(OperatorAutoConnect) | |
| bpy.utils.unregister_class(OperatorSelectDuplicateJoint) | |
| del bpy.types.Scene.autoConnectMargin | |
| del bpy.types.Scene.autoConnectThreshold | |
| del bpy.types.Scene.autoConnectDistance | |
| del bpy.types.Scene.autoConnectLimit | |
| ### Cut With Plane ### | |
| bpy.utils.unregister_class(AddonPanelCutWithPlanes) | |
| bpy.utils.unregister_class(OperatorCutWithPlanes) | |
| bpy.utils.unregister_class(OperatorCreatePlanes) | |
| del bpy.types.Scene.CutWithPlanesMargin | |
| del bpy.types.Scene.CutWithPlanesNumberOfPlanes | |
| del bpy.types.Scene.CutWithPlanesFirstSubdivide | |
| del bpy.types.Scene.CutWithPlanesFirstFractal | |
| del bpy.types.Scene.CutWithPlanesSecondSubdivide | |
| del bpy.types.Scene.CutWithPlanesSecondFractal | |
| del bpy.types.Scene.CutWithPlanesSmoothFactor | |
| del bpy.types.Scene.CutWithPlanesSmoothRepeat | |
| del bpy.types.Scene.CutWithPlanesCenterOrLine | |
| if __name__ == "__main__": | |
| register() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment