219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | # -*- 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="") |