452 lines
12 KiB
Python
452 lines
12 KiB
Python
# 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)
|
|
|