# NX Version:NX 2412 # Email:809262979@qq.com # python .py created by deepseek import math import NXOpen import NXOpen.CAM import NXOpen.Features import NXOpen.SIM # ---------------------------------------------- # 初始化CAM Session # ---------------------------------------------- def init_cam(): session = NXOpen.Session.GetSession() session.ApplicationSwitchImmediate("UG_APP_MANUFACTURING") session.IsCamSessionInitialized() return session # ---------------------------------------------- # 初始化CAM WorkPart # ---------------------------------------------- def init_workpart(arg_session): workpart = arg_session.Parts.Work return workpart # ---------------------------------------------- # 初始化GENERIC_MACHINE父级 # ---------------------------------------------- def init_parent_generic_machine(arg_workpart): temp_machine = arg_workpart.CAMSetup.CAMGroupCollection.FindObject("GENERIC_MACHINE") return temp_machine # ---------------------------------------------- # 初始化GEOMETRY父级 # ---------------------------------------------- def init_parent_geometry(arg_workpart): temp_geometry = arg_workpart.CAMSetup.CAMGroupCollection.FindObject("GEOMETRY") return temp_geometry # ---------------------------------------------- # 初始化方法组父级 # ---------------------------------------------- def init_parent_nc_method(arg_workpart): temp_method = arg_workpart.CAMSetup.CAMGroupCollection.FindObject("METHOD") return temp_method # ---------------------------------------------- # 初始化方法组父级 # ---------------------------------------------- def init_parent_nc_program(arg_workpart): temp_nc_program = arg_workpart.CAMSetup.CAMGroupCollection.FindObject("NC_PROGRAM") return temp_nc_program # ---------------------------------------------- # 初始化加工模板 # ---------------------------------------------- def init_template_name(): temp_template_name="mill_contour" return temp_template_name # ---------------------------------------------- # 初始化刀具 # ---------------------------------------------- def create_tool(arg_workpart,arg_machine,arg_template_name,arg_tool_name,arg_tool_diameter): #先用FindObject函数通过arg_tool_name查找刀具对象是否存在, #如果FindObject查找的对象不存在则创建 #这里建议使用Try容错处理 temp_tool = None try: #查找刀具对象 temp_tool = arg_workpart.CAMSetup.CAMGroupCollection.FindObject(arg_tool_name) except Exception as e: #创建刀具对象 tool_group = arg_workpart.CAMSetup.CAMGroupCollection.CreateToolWithUserName(arg_machine, arg_template_name, "MILL", NXOpen.CAM.NCGroupCollection.UseDefaultName.TrueValue, "MILL", "Mill") millToolBuilder = arg_workpart.CAMSetup.CAMGroupCollection.CreateMillToolBuilder(tool_group) #设定刀具半径 millToolBuilder.TlDiameterBuilder.Value = arg_tool_diameter temp_tool = millToolBuilder.Commit() millToolBuilder.Destroy() return temp_tool # ---------------------------------------------- # 初始化加工坐标系 # ---------------------------------------------- def create_mcs(arg_workpart,arg_geometry,arg_template_name,arg_mcs_name): #先用FindObject函数通过arg_mcs_name查找刀具对象是否存在, #如果FindObject查找的对象不存在则创建 #这里建议使用Try容错处理 temp_mcs=None try: #通过arg_mcs_name查找坐标系对象 temp_mcs = arg_workpart.CAMSetup.CAMGroupCollection.FindObject(arg_mcs_name,NXOpen.CAM.CAMGroup.CAMGroupType.MachineCoordinateSystem) except Exception as e:#查找对象错误则转到创建mcs坐标系对象 #创建mcs坐标系对象 orient_geometry = arg_workpart.CAMSetup.CAMGroupCollection.CreateGeometryWithUserName(arg_geometry, arg_template_name, "MCS", NXOpen.CAM.NCGroupCollection.UseDefaultName.TrueValue, arg_mcs_name, "MCS") millOrientBuilder = arg_workpart.CAMSetup.CAMGroupCollection.CreateMillOrientGeomBuilder(orient_geometry) millOrientBuilder.GetCsysPurposeMode() millOrientBuilder.GetSpecialOutputMode() millOrientBuilder.GetToolAxisMode() unit1 = arg_workpart.UnitCollection.FindObject("MilliMeter") millOrientBuilder.GetLowerLimitMode() millOrientBuilder.TransferClearanceBuilder.SafeDistance = 10.0 #安全高度 arg_workpart.Expressions.CreateSystemExpressionWithUnits("0", unit1) temp_mcs = millOrientBuilder.Commit() millOrientBuilder.Destroy() return temp_mcs # ---------------------------------------------- # 创建几何体 # ---------------------------------------------- def create_cam_feature(arg_workpart,arg_mcs,arg_template_name): feature_geometry = arg_workpart.CAMSetup.CAMGroupCollection.CreateGeometryWithUserName(arg_mcs, arg_template_name, "WORKPIECE", NXOpen.CAM.NCGroupCollection.UseDefaultName.TrueValue, "WORKPIECE", "Workpiece") feature_mill_geom_builder = arg_workpart.CAMSetup.CAMGroupCollection.CreateMillGeomBuilder(feature_geometry) feature_mill_geom_builder.PartGeometry.InitializeData(False) geometrySetList = feature_mill_geom_builder.PartGeometry.GeometryList taggedObject = geometrySetList.FindItem(0) geometrySet = taggedObject partLoadStatus = arg_workpart.LoadThisPartFully() partLoadStatus.Dispose() selectionIntentRuleOptions = arg_workpart.ScRuleFactory.CreateRuleOptions() selectionIntentRuleOptions.SetSelectedFromInactive(False) bodies1 = [NXOpen.Body.Null] * 1 body = arg_workpart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(1)") bodies1[0] = body bodyDumbRule1 = arg_workpart.ScRuleFactory.CreateRuleBodyDumb(bodies1, True, selectionIntentRuleOptions) selectionIntentRuleOptions.Dispose() scCollector = geometrySet.ScCollector rules1 = [None] * 1 rules1[0] = bodyDumbRule1 scCollector.ReplaceRules(rules1, False) feature = feature_mill_geom_builder.Commit() feature_mill_geom_builder.Destroy() return feature,body # ---------------------------------------------- # 创建毛坯 # ---------------------------------------------- def create_block_feature(arg_workpart,arg_cam_feature,arg_body): block_mill_geom_builder = arg_workpart.CAMSetup.CAMGroupCollection.CreateMillGeomBuilder(arg_cam_feature) block_mill_geom_builder.BlankGeometry.InitializeData(False) block_mill_geom_builder.BlankGeometry.GeometryList block_mill_geom_builder.BlankGeometry.BlankIpwMultipleSource.SetList block_mill_geom_builder.BlankGeometry.BlankDefinitionType = NXOpen.CAM.GeometryGroup.BlankDefinitionTypes.AutoBlock toolingBoxBuilder1 = arg_workpart.Features.ToolingFeatureCollection.CreateToolingBoxBuilder(NXOpen.Features.ToolingBox.Null) selections1 = [NXOpen.NXObject.Null] * 1 selections1[0] = arg_body deselections1 = [] toolingBoxBuilder1.SetSelectedOccurrences(selections1, deselections1) toolingBoxBuilder1.OffsetPositiveZ temp_block_geom = block_mill_geom_builder.Commit() block_mill_geom_builder.Destroy() millGeomBuilder3 = arg_workpart.CAMSetup.CAMGroupCollection.CreateMillGeomBuilder(temp_block_geom) block_feature = millGeomBuilder3.Commit() millGeomBuilder3.Destroy() return block_feature # ---------------------------------------------- # 创建工序 # ---------------------------------------------- def cam_program(arg_workpart,arg_nc_program,arg_method,arg_tool,arg_feature,arg_template_name): operation = arg_workpart.CAMSetup.CAMOperationCollection.CreateWithUserName(nc_program, method, tool, block_feature, template_name, "CAVITY_MILL", NXOpen.CAM.OperationCollection.UseDefaultName.TrueValue, "CAVITY_MILL", "Cavity Mill") cavityMilling = operation cavityMillingBuilder = arg_workpart.CAMSetup.CAMOperationCollection.CreateCavityMillingBuilder(cavityMilling) cavityMillingBuilder.CutLevel.InitializeData() # 切削参数 cavityMillingBuilder.CutLevel.GlobalDepthPerCut.DistanceBuilder.Value = 0.5 cavityMillingBuilder.CutLevel.ApplyGlobalDepthPerCut() cavityMillingBuilder.CutPattern.CutPattern = NXOpen.CAM.CutPatternBuilder.Types.FollowPeriphery cavityMillingBuilder.CutParameters.PatternDirection = NXOpen.CAM.CutParametersPatternDirectionTypes.Inward cavityMillingBuilder.NonCuttingBuilder.TransferAvoidanceFromBuilder.ToolAxis = NXOpen.Direction.Null cavityMillingBuilder.NonCuttingBuilder.TransferAvoidanceGohomeBuilder.ToolAxis = NXOpen.Direction.Null cavityMillingBuilder.NonCuttingBuilder.EngageOpenAreaBuilder.Vector = NXOpen.Direction.Null cavityMillingBuilder.NonCuttingBuilder.ClearanceBuilder.AxisObject = NXOpen.Direction.Null cavityMillingBuilder.CutParameters.CutOrder = NXOpen.CAM.CutParametersCutOrderTypes.DepthFirst cavityMillingBuilder.CutParameters.PartStock.Value = 0.14999999999999999 cavityMillingBuilder.FeedsBuilder.SpindleRpmBuilder.Value = 5000.0 cavityMillingBuilder.NonCuttingBuilder.RetractAreaBuilder.Vector = NXOpen.Direction.Null cavityMillingBuilder.NonCuttingBuilder.RetractFinalBuilder.Vector = NXOpen.Direction.Null cavityMillingBuilder.FeedsBuilder.RecalculateData(NXOpen.CAM.FeedsBuilder.RecalculateBasedOn.SpindleSpeed) cavityMillingBuilder.NonCuttingBuilder.EngageOpenAreaBuilder.EngRetType = NXOpen.CAM.NcmPlanarEngRetBuilder.EngRetTypes.Linear nXObject6 = cavityMillingBuilder.Commit() objects1 = [NXOpen.CAM.CAMObject.Null] * 1 cavityMilling2 = nXObject6 objects1[0] = cavityMilling2 arg_workpart.CAMSetup.GenerateToolPath(objects1) cavityMillingBuilder.Destroy() cavityMillingBuilder2 = arg_workpart.CAMSetup.CAMOperationCollection.CreateCavityMillingBuilder(cavityMilling2) isupdated2 = cavityMillingBuilder2.CutLevel.InitializeData() toolpath=cavityMillingBuilder2.Commit() cavityMillingBuilder2.Destroy() #显示刀路 session.CAMSession.PathDisplay.ShowToolPath(toolpath) session.CAMSession.PathDisplay.Jump(False) if __name__ == '__main__': # ---------------------------------------------- # tool_diameter变量为刀具直径,数值类型双精度 # tool_name变量为刀具名字,根据tool_diameter生成 # nc_program_name变量默认为字符串"NC_PROGRAM" # nc_method_name变量默认为"METHOD" # 四个变量必须生成 # example: # tool_diameter=8.0 # tool_name="8.0铣刀" # nc_program_name="NC_PROGRAM" # nc_method_name="METHOD" # mcs_name ="MCS" # ---------------------------------------------- tool_name = None tool_diameter = None nc_program_name = None nc_method_name = None mcs_name = None session=init_cam() workpart=init_workpart(session) generic_machine=init_parent_generic_machine(workpart) geometry=init_parent_geometry(workpart) nc_program=init_parent_nc_program(workpart,nc_program_name) nc_method=init_parent_nc_method(workpart,nc_method_name) template_name=init_template_name() tool=create_tool(workpart,generic_machine,template_name,tool_name,tool_diameter) mcs=create_mcs(workpart,geometry,template_name,mcs_name) cam_feature,body=create_cam_feature(workpart,mcs,template_name) block_feature=create_block_feature(workpart,cam_feature,body) cam_program(workpart,nc_program,nc_method,tool,cam_feature,template_name)