mirror of
				https://dev.azure.com/OOOOO0OOOOO/O/_git/0-0-8-088-00-080-00-880-8-0-0
				synced 2025-10-31 10:35:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| # ---------------------------- Operators ------------------------
 | |
| import bpy
 | |
| import math
 | |
| 
 | |
| from mathutils import Vector
 | |
| 
 | |
| from . import cfg
 | |
| from . import at_interface
 | |
| from . at_calc_func import at_random_fill, fill_rotation
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_at_start(bpy.types.Operator):
 | |
|     """Start and init the addon"""
 | |
|     bl_idname = 'scene.at_op'
 | |
|     bl_label = "Start array"
 | |
| 
 | |
|     @classmethod
 | |
|     def poll(cls, context):
 | |
|         return not context.scene.arraytools_prop.already_start
 | |
| 
 | |
|     def execute(self, context):
 | |
|         cfg.init_array_tool(context)
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_at_done(bpy.types.Operator):
 | |
|     """Apply the settings"""
 | |
|     bl_idname = 'scene.at_done'
 | |
|     bl_label = "Done !"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         cfg.atools_objs.clear()
 | |
|         #cfg.at_mtx_list.clear()
 | |
|         array_col = bpy.data.collections.get(cfg.col_name)
 | |
|         cfg.col_name = "Array_collection"
 | |
|         context.scene.arraytools_prop.up_ui_reset()
 | |
|         context.scene.arraytools_prop.already_start = False
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_at_cancel(bpy.types.Operator):
 | |
|     """Cancel the settings"""
 | |
|     bl_idname = 'scene.at_cancel'
 | |
|     bl_label = "Cancel"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         scn = context.scene
 | |
|         scn.arraytools_prop.at_del_all(True)
 | |
|         scn.arraytools_prop.up_ui_reset()
 | |
|         scn.arraytools_prop.already_start = False
 | |
|         cfg.col_name = "Array_collection"
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_fill_tr(bpy.types.Operator):
 | |
|     """Fill the random translation fields"""
 | |
|     bl_idname = 'scene.fill_tr'
 | |
|     bl_label = "Fill"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         offset = prop.tr_offset
 | |
| 
 | |
|         for i in range(3):
 | |
|             if offset[i] == 0.0:
 | |
|                 prop.tr_min[i], prop.tr_max[i] = at_random_fill(-3.0, 3.0)
 | |
|             else:
 | |
|                 prop.tr_min[i], prop.tr_max[i] = at_random_fill(-offset[i]/2, offset[i]/2)
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_fill_sc(bpy.types.Operator):
 | |
|     """Fill the random scale fields"""
 | |
|     bl_idname = 'scene.fill_sc'
 | |
|     bl_label = "Fill"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         offset = prop.sc_offset
 | |
| 
 | |
|         if 100 in [offset[0], offset[1], offset[2]]:
 | |
|             prop.sc_min_x, prop.sc_max_x = at_random_fill(40.0, 120.0)
 | |
|             prop.sc_min_y, prop.sc_max_y = at_random_fill(40.0, 120.0)
 | |
|             prop.sc_min_z, prop.sc_max_z = at_random_fill(40.0, 120.0)
 | |
|         else:
 | |
|             rand = [(100 - offset[i]) / 2 for i in range(3)]
 | |
|             print(rand)
 | |
|             prop.sc_min_x, prop.sc_max_x = at_random_fill(offset[0]-rand[0], offset[0]+rand[0])
 | |
|             prop.sc_min_y, prop.sc_max_y = at_random_fill(offset[1]-rand[1], offset[1]+rand[1])
 | |
|             prop.sc_min_z, prop.sc_max_z = at_random_fill(offset[2]-rand[2], offset[2]+rand[2])
 | |
|         if prop.sc_all:
 | |
|             prop.sc_min_x = prop.sc_min_y = prop.sc_min_z
 | |
|             prop.sc_max_x = prop.sc_max_y = prop.sc_max_z
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_fill_rot(bpy.types.Operator):
 | |
|     """Fill the random rotation fields"""
 | |
|     bl_idname = 'scene.fill_rot'
 | |
|     bl_label = "Fill"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         fill_rotation(context)
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_x360(bpy.types.Operator):
 | |
|     """Quick 360 degrees on X axis"""
 | |
|     bl_idname = 'scene.x360'
 | |
|     bl_label = "360"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.tr_offset = Vector((0.0, 0.0, 0.0))
 | |
|         prop.rot_global = Vector((math.pi/180*360, 0.0, 0.0))
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_y360(bpy.types.Operator):
 | |
|     """Quick 360 degrees on Y axis"""
 | |
|     bl_idname = 'scene.y360'
 | |
|     bl_label = "360"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.tr_offset = Vector((0.0, 0.0, 0.0))
 | |
|         prop.rot_global = Vector((0.0, math.pi/180*360, 0.0))
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_z360(bpy.types.Operator):
 | |
|     """Quick 360 degrees on Z axis"""
 | |
|     bl_idname = 'scene.z360'
 | |
|     bl_label = "360"
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.tr_offset = Vector((0.0, 0.0, 0.0))
 | |
|         prop.rot_global = Vector((0.0, 0.0, math.pi/180*360))
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_reset_tr(bpy.types.Operator):
 | |
|     """Reset the settings of random translation"""
 | |
|     bl_idname = 'scene.at_reset_tr'
 | |
|     bl_label = 'Reset'
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.tr_min[0], prop.tr_min[1], prop.tr_min[2] = 0.0, 0.0, 0.0
 | |
|         prop.tr_max[0], prop.tr_max[1], prop.tr_max[2] = 0.0, 0.0, 0.0
 | |
| 
 | |
|         # if operator is used many times
 | |
|         # get weird result != 0 with vector
 | |
|         # prop.tr_max = Vector((0.0, 0.0, 0.0))
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_reset_sc(bpy.types.Operator):
 | |
|     """Reset the settings of random scale"""
 | |
|     bl_idname = 'scene.at_reset_sc'
 | |
|     bl_label = 'Reset'
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.sc_min_x, prop.sc_min_y, prop.sc_min_z = 100, 100, 100
 | |
|         prop.sc_max_x, prop.sc_max_y, prop.sc_max_z = 100, 100, 100
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_reset_rot(bpy.types.Operator):
 | |
|     """Reset the settings of random rotation"""
 | |
|     bl_idname = 'scene.at_reset_rot'
 | |
|     bl_label = 'Reset'
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.rot_min[0], prop.rot_min[1], prop.rot_min[2] = 0.0, 0.0, 0.0
 | |
|         prop.rot_max[0], prop.rot_max[1], prop.rot_max[2] = 0.0, 0.0, 0.0
 | |
|         return{'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_reset_second(bpy.types.Operator):
 | |
|     """Reset the settings of row options"""
 | |
|     bl_idname = 'scene.at_reset_second'
 | |
|     bl_label = 'Reset'
 | |
| 
 | |
|     def execute(self, context):
 | |
|         prop = context.scene.arraytools_prop
 | |
|         prop.tr_second = (0,0,0)
 | |
|         prop.sc_second = (100,100,100)
 | |
|         prop.rot_second = (0,0,0)
 | |
|         return {'FINISHED'}
 | |
| 
 | |
| 
 | |
| class OBJECT_OT_error(bpy.types.Operator):
 | |
|     """Draw a message box to display error"""
 | |
|     bl_idname = "info.at_error"
 | |
|     bl_label = "Message info"
 | |
| 
 | |
|     info: bpy.props.StringProperty(
 | |
|         name = "Message",
 | |
|         description = "Display a message",
 | |
|         default = ''
 | |
|     )
 | |
| 
 | |
|     def execute(self, context):
 | |
|         self.report({'INFO'}, self.info)
 | |
|         print(self.info)
 | |
|         return {'FINISHED'}
 | |
| 
 | |
|     def invoke(self, context, event):
 | |
|         return context.window_manager.invoke_props_dialog(self)
 | |
| 
 | |
|     def draw(self, context):
 | |
|         layout = self.layout
 | |
|         layout.label(text=self.info)
 | |
|         layout.label(text="") | 
