from odoo import fields, models, api class ToolMaterialsBasicParameters(models.Model): _name = 'sf.tool.materials.basic.parameters' _description = '刀具物料基本参数' name = fields.Char('物料号', size=50) standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库') cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型', store=True) # 整体式刀具参数 total_length = fields.Float('总长度(mm)') blade_number = fields.Selection( [('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], string='刃数(个)') neck_diameter = fields.Float('颈部直径(mm)') neck_length = fields.Float('颈部长度(mm)') handle_diameter = fields.Float('柄部直径(mm)') handle_length = fields.Float('柄部长度(mm)') blade_tip_diameter = fields.Integer('刀尖直径(mm)') blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20) blade_tip_taper = fields.Integer('刀尖锥度(°)') blade_diameter = fields.Float('刃部直径(mm)') blade_length = fields.Float('刃部长度(mm)') blade_helix_angle = fields.Integer('刃部螺旋角(°)') blade_width = fields.Float('刃部宽度(mm)') blade_depth = fields.Float('刃部深度(mm)') pitch = fields.Float('牙距(mm)') cutting_depth = fields.Float('切削深度(mm)') # 刀片参数 length = fields.Float('长度(mm)') thickness = fields.Float('厚度(mm)') width = fields.Float('宽度(mm)') cutting_blade_length = fields.Float('切削刃长(mm)') relief_angle = fields.Integer('后角(°)') blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20) inscribed_circle_diameter = fields.Float('内接圆直径(mm)') install_aperture_diameter = fields.Float('安装孔直径(mm)') chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')], string='有无断屑槽') blade_teeth_model = fields.Selection( [('无', '无'), ('V牙型', 'V牙型'), ('米制全牙型', '米制全牙型'), ('美制全牙型', '美制全牙型'), ('惠氏全牙型', '惠氏全牙型'), ('BSPT全牙型', 'BSPT全牙型'), ('NPT全牙型', 'NPT全牙型'), ('UNJ全牙型', 'UNJ全牙型'), ('DIN405圆牙型', 'DIN405圆牙型'), ('ACME梯形', 'ACME梯形'), ('石油管螺纹刀片', '石油管螺纹刀片'), ('矮牙ACME梯形', '矮牙ACME梯形'), ('Trapeze30° 103', 'Trapeze30° 103')], string='刀片牙型', default='无') blade_blade_number = fields.Selection([('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')], string='刀片的刃数(个)') main_included_angle = fields.Integer('主偏角(°)') top_angle = fields.Integer('顶角(°)') blade_tip_dip_angle = fields.Integer('刀尖倾角(°)') side_cutting_edge_angle = fields.Integer('侧切削角(°)') thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型', default='无') thread_num = fields.Float('每英寸螺纹数(tpi)') blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20) inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20) thickness_tolerance = fields.Char('厚度公差(mm)', size=20) # 刀杆参数 height = fields.Float('高度(mm)') blade_height = fields.Float('刃部高度(mm)') knife_head_height = fields.Float('刀头高度(mm)') knife_head_width = fields.Float('刀头宽度(mm)') knife_head_length = fields.Float('刀头长度(mm)') cut_depth_max = fields.Float('最大切削深度(mm)') cutter_arbor_diameter = fields.Float('刀杆直径(mm)') min_machining_aperture = fields.Integer('最小加工孔径(mm)') install_blade_tip_num = fields.Integer('可装刀片数/齿数(个)') cutting_blade_model = fields.Char('切削类型', size=20) is_cooling_hole = fields.Boolean('有无冷却孔') locating_slot_code = fields.Char('定位槽代号', size=20) installing_structure = fields.Char('安装结构', size=20) blade_ids = fields.Many2many( 'sf.cutting.tool.type', relation='basic_param_pad_blade_rel', column1='model_id_1', column2='model_id_2', domain="[('cutting_tool_material_id.name', '=', '刀片')]", string='适配刀片型号' # 使用空列表作为默认值 ) tool_shim = fields.Char('适配刀垫型号', size=50) cotter_pin = fields.Char('适配销钉型号', size=50) pressing_plate = fields.Char('适配压板型号', size=50) screw = fields.Char('适配螺钉型号', size=50) spanner = fields.Char('适配扳手型号', size=50) # 刀盘参数 cutter_head_diameter = fields.Float('刀盘直径(mm)') interface_diameter = fields.Float('接口直径(mm)') # 刀柄参数 flange_shank_length = fields.Float('法兰柄长(mm)') handle_external_diameter = fields.Float('柄部外径(mm)') handle_inside_diameter = fields.Float('柄部内径(mm)') min_clamping_diameter = fields.Float('最小夹持直径(mm)') max_clamping_diameter = fields.Float('最大夹持直径(mm)') clamping_mode = fields.Char('夹持方式', size=20) max_load_capacity = fields.Float('最大负载能力(kg)') taper = fields.Integer('锥度(°)') tool_changing_time = fields.Integer('换刀时间(s)') standard_rotate_speed = fields.Integer('标准转速(n/min)') max_rotate_speed = fields.Integer('最大转速(n/min)') diameter_slip_accuracy = fields.Char('径跳精度(mm)', size=20) cooling_model = fields.Char('冷却类型', size=20) is_rough_machining = fields.Boolean('可粗加工', default=False) is_finish_machining = fields.Boolean('可精加工', default=False) is_quick_cutting = fields.Boolean('可高速切削', default=False) is_drill_hole = fields.Boolean('可钻孔', default=False) is_safe_lock = fields.Boolean('有无安全锁', default=False) # 夹头参数 er_size_model = fields.Char('ER尺寸型号', size=20) outer_diameter = fields.Float('外径(mm)') inner_diameter = fields.Float('内径(mm)') run_out_accuracy = fields.Char('跳动精度(mm)', size=20) top_diameter = fields.Float('顶部直径(mm)') weight = fields.Float('重量(kg)', size=20) clamping_length = fields.Float('夹持长度(mm)') clamping_tolerance = fields.Char('夹持公差(mm)', size=20) cooling_jacket = fields.Char('适用冷却套型号', size=50) handle_ids = fields.Many2many( 'sf.cutting.tool.type', relation='basic_param_chuck_handle_rel', column1='model_id_1', column2='model_id_2', domain="[('cutting_tool_material_id.name', '=', '刀柄')]", string='适用刀柄型号' ) def _json_integral_tool_basic_param(self, obj): integral_tool_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'total_length': obj['total_length'], 'blade_diameter': obj['blade_diameter'], 'blade_length': obj['blade_length'], 'blade_number': obj['blade_number'], 'neck_length': obj['neck_length'], 'neck_diameter': obj['neck_diameter'], 'handle_diameter': obj['handle_diameter'], 'handle_length': obj['handle_length'], 'blade_tip_diameter': obj['blade_tip_diameter'], 'blade_tip_working_size': obj['blade_tip_working_size'], 'blade_tip_taper': obj['blade_tip_taper'], 'blade_helix_angle': obj['blade_helix_angle'], 'blade_width': obj['blade_width'], 'blade_depth': obj['blade_depth'], 'pitch': obj['pitch'], 'cutting_depth': obj['cutting_depth'], }) return integral_tool_basic_param_str def _json_blade_basic_param(self, obj): blade_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'length': obj['length'], 'thickness': obj['thickness'], 'width': obj['width'], 'cutting_blade_length': obj['cutting_blade_length'], 'relief_angle': obj['relief_angle'], 'blade_tip_circular_arc_radius': obj['blade_tip_circular_arc_radius'], 'inscribed_circle_diameter': obj['inscribed_circle_diameter'], 'install_aperture_diameter': obj['install_aperture_diameter'], 'pitch': obj['pitch'], 'chip_breaker_groove': obj['chip_breaker_groove'], 'blade_teeth_model': '无' if not obj['bladed_teeth_model'] else obj['bladed_teeth_model'], 'blade_blade_number': obj['blade_blade_number'], 'cutting_depth': obj['cutting_depth'], 'blade_width': obj['blade_width'], 'main_included_angle': obj['main_included_angle'], 'top_angle': obj['top_angle'], 'blade_tip_dip_angle': obj['blade_tip_dip_angle'], 'side_cutting_edge_angle': obj['side_cutting_edge_angle'], 'thread_model': '无' if not obj['thread_model'] else obj['thread_model'], 'thread_num': obj['thread_num'], 'blade_tip_height_tolerance': obj['blade_tip_height_tolerance'], 'inscribed_circle_tolerance': obj['inscribed_circle_tolerance'], 'thickness_tolerance': obj['thickness_tolerance'], }) return blade_basic_param_str def _json_cutter_arbor_basic_param(self, obj): cutter_arbor_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'height': obj['height'], 'width': obj['width'], 'total_length': obj['total_length'], 'knife_head_height': obj['knife_head_height'], 'knife_head_width': obj['knife_head_width'], 'knife_head_length': obj['knife_head_length'], 'cutter_arbor_diameter': obj['cutter_arbor_diameter'], 'main_included_angle': obj['main_included_angle'], 'relief_angle': obj['relief_angle'], 'cutting_depth': obj['cutting_depth'], 'min_machining_aperture': obj['min_machining_aperture'], 'install_blade_tip_num': obj['install_blade_tip_num'], 'cutting_blade_model': obj['cutting_blade_model'], 'is_cooling_hole': obj['is_cooling_hole'], 'locating_slot_code': obj['locating_slot_code'], 'installing_structure': obj['installing_structure'], 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids( obj['blade_codes']), 'tool_shim': obj['tool_shim'], 'cotter_pin': obj['cotter_pin'], 'pressing_plate': obj['pressing_plate'], 'screw': obj['screw'], 'spanner': obj['spanner'], }) return cutter_arbor_basic_param_str def _json_cutter_head_basic_param(self, obj): cutter_head_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'install_blade_tip_num': obj['install_blade_tip_num'], 'blade_diameter': obj['blade_diameter'], 'cutter_head_diameter': obj['cutter_head_diameter'], 'interface_diameter': obj['interface_diameter'], 'total_length': obj['total_length'], 'blade_length': obj['blade_length'], 'cutting_depth': obj['cutting_depth'], 'main_included_angle': obj['main_included_angle'], 'installing_structure': obj['installing_structure'], 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids( obj['blade_codes']), 'screw': obj['screw'], 'spanner': obj['spanner'], 'cutting_blade_model': obj['cutting_blade_model'], 'is_cooling_hole': obj['is_cooling_hole'], 'locating_slot_code': obj['locating_slot_code'], }) return cutter_head_basic_param_str def _json_knife_handle_basic_param(self, obj): knife_handle_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'total_length': obj['total_length'], 'flange_shank_length': obj['flange_shank_length'], 'handle_external_diameter': obj['handle_external_diameter'], 'handle_inside_diameter': obj['handle_inside_diameter'], 'min_clamping_diameter': obj['min_clamping_diameter'], 'max_clamping_diameter': obj['max_clamping_diameter'], 'clamping_mode': obj['clamping_mode'], 'max_load_capacity': obj['max_load_capacity'], 'taper': obj['taper'], 'tool_changing_time': obj['tool_changing_time'], 'standard_rotate_speed': obj['standard_rotate_speed'], 'max_rotate_speed': obj['max_rotate_speed'], 'diameter_slip_accuracy': obj['diameter_slip_accuracy'], 'cooling_model': obj['cooling_model'], 'is_rough_machining': obj['is_rough_machining'], 'is_finish_machining': obj['is_finish_machining'], 'is_quick_cutting': obj['is_quick_cutting'], 'is_drill_hole': obj['is_drill_hole'], 'is_safe_lock': obj['is_safe_lock'], 'screw': obj['screw'], 'spanner': obj['spanner'], }) return knife_handle_basic_param_str def _json_chuck_basic_param(self, obj): chuck_basic_param_str = (0, '', { 'name': obj['name'], 'cutting_tool_type': obj['cutting_tool_type'], 'er_size_model': obj['er_size_model'], 'min_clamping_diameter': obj['min_clamping_diameter'], 'max_clamping_diameter': obj['max_clamping_diameter'], 'outer_diameter': obj['outer_diameter'], 'inner_diameter': obj['inner_diameter'], 'run_out_accuracy': obj['run_out_accuracy'], 'total_length': obj['total_length'], 'taper': obj['taper'], 'run_out_accuracy': obj['run_out_accuracy'], 'top_diameter': obj['top_diameter'], 'weight': obj['weight'], 'clamping_mode': obj['clamping_mode'], 'clamping_length': obj['clamping_length'], 'clamping_tolerance': obj['clamping_tolerance'], 'max_load_capacity': obj['max_load_capacity'], 'handle_ids': [(6, 0, [])] if not obj.get( 'handle_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids(obj['handle_codes']), 'cooling_jacket': obj['cooling_jacket'], }) return chuck_basic_param_str class CuttingSpeed(models.Model): _name = 'sf.cutting.speed' _description = '切削速度Vc' product_template_id = fields.Many2one('product.template') standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') execution_standard_id = fields.Many2one('sf.international.standards', string='执行标准', store=True) material_code = fields.Char('材料代号') material_id = fields.Many2one('sf.materials.model', '材料名称', domain="[('standards_id', '=', execution_standard_id)]") slope_milling_angle = fields.Integer('坡铣角度(°)') material_grade = fields.Char('材料牌号') tensile_strength = fields.Char('拉伸强度 (N/mm²)') hardness = fields.Integer('硬度(HRC)') cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc') cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc') cutting_speed_n3 = fields.Char('径向切宽 ae=25%D1 ap=L1max 切削速度Vc') cutting_speed_n4 = fields.Char('径向切宽 ae=15%D1 ap=L1max 切削速度Vc') cutting_speed_n5 = fields.Char('径向切宽 ae=5%D1 ap=L1max 切削速度Vc') rough_machining = fields.Char('粗加工 Vc(m/min)') precision_machining = fields.Char('精加工 Vc(m/min)') application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用') def _json_cutting_speed(self, obj): cutting_speed_str = (0, '', { 'execution_standard_id': self.env['sf.international.standards'].search( [('code', '=', obj['execution_standard_code'])]).id, 'material_code': obj['material_code'], 'material_id': self.env['sf.materials.model'].search([('materials_no', '=', obj['material_name_code'])]).id, 'material_grade': obj['material_grade'], 'tensile_strength': obj['tensile_strength'], 'hardness': obj['hardness'], 'cutting_speed_n1': obj['cutting_speed_n1'], 'cutting_speed_n2': obj['cutting_speed_n2'], 'cutting_speed_n3': obj['cutting_speed_n3'], 'cutting_speed_n4': obj['cutting_speed_n4'], 'cutting_speed_n5': obj['cutting_speed_n5'], 'rough_machining': obj['rough_machining'], 'precision_machining': obj['precision_machining'], 'application': obj['application'], }) return cutting_speed_str class FeedPerTooth(models.Model): _name = 'sf.feed.per.tooth' _description = '每齿走刀量fz' _order = 'machining_method desc, blade_diameter, materials_type_id' product_template_id = fields.Many2one('product.template') standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') cutting_speed = fields.Char('径向切宽 ae(mm)') machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式') materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') blade_diameter = fields.Integer('刃部直径(mm)', readonly=True) feed_per_tooth = fields.Char('每齿走刀量 (mm/z)') def _json_feed_per_tooth(self, obj): feed_per_tooth_str = (0, '', { 'cutting_speed': obj['cutting_speed'], 'blade_diameter': obj['blade_diameter'], 'feed_per_tooth': obj['feed_per_tooth'], }) return feed_per_tooth_str def _json_feed_per_tooth_2(self, obj): feed_per_tooth_2_str = (0, '', { 'machining_method': obj['machining_method'], 'materials_type_id': self.env['sf.materials.model'].search( [('materials_no', '=', obj['materials_type_code'])]).id, 'blade_diameter': obj['blade_diameter'], 'feed_per_tooth': obj['feed_per_tooth'], }) return feed_per_tooth_2_str def _json_feed_per_tooth_3(self, obj): feed_per_tooth_3_str = (0, '', { 'cutting_speed': obj['cutting_speed'], 'feed_per_tooth': obj['feed_per_tooth'], }) return feed_per_tooth_3_str def _json_feed_per_tooth_4(self, obj): feed_per_tooth_4_str = (0, '', { 'machining_method': obj['machining_method'], 'materials_type_id': self.env['sf.materials.model'].search( [('materials_no', '=', obj['materials_type_code'])]).id, 'feed_per_tooth': obj['feed_per_tooth'], }) return feed_per_tooth_4_str # @api.depends('product_template_id') # def _compute_product_template_id(self): # if self.product_template_id is not None: # self.blade_diameter = self.product_template_id.cutting_tool_blade_diameter