做Mastercam后处理的朋友,刀具清单输出是不是总让你头大?想让NC代码开头整齐列个表,结果重复的刀号刷刷往外冒。2026年了,别再手动删了,用堆栈(Stack)逻辑一劳永逸。
想象一下,你有10个操作,用了5把刀。普通输出会打印10次刀具信息,烦都烦死了。堆栈法的核心逻辑是:只存不重。
它就像一个桶,第一把刀扔进去,第二把刀扔进去……如果第三把刀和第一把一样,桶里就不放了。最后桶里剩下的,就是这10个操作里用到的唯一刀具集合。这样输出的清单,简洁、专业,还不容易出错。
这套代码分三步走:定义格式、压栈去重、弹出输出。
在后处理头部,先定义好我们要用的变量和输出格式。
# 定义数据格式
fs2 1 0.7 0.6 # 小数位控制
fs2 2 0.4 0.3 # 整数位控制
# 初始化刀具数据
tool_number : 0
tool_offset : 0
tool_length_offset : 0
tool_diameter : 0
tool_corner_radius : 0
# 定义输出前缀(好看点)
fmt "T-> " 2 output_tool_number
fmt "D-> " 2 output_tool_offset
fmt "H-> " 2 output_tool_length_offset
fmt "Dia-> " 2 output_tool_diameter
fmt "R-> " 2 output_tool_corner_radius这是最烧脑但也最精彩的部分。利用push和pop指令操作堆栈。
# 定义堆栈
stack_tool_number : 0
stack_size : 0
stack_result : 0
fstack 1 5 # 定义堆栈1,深度5
# 压栈函数
padd_tool_to_stack
is_tool_in_stack = no$
stack_size = pop(1, stack_result, 0) # 查看栈里有多少把刀
# 循环检查栈内是否已存在该刀具
while stack_size > 0,
[
stack_tool_number = pop(1, stack_size, 5)
if stack_tool_number = tool_number,
[
is_tool_in_stack = yes$ # 找到了,标记
stack_size = -1 # 跳出循环
]
stack_size = stack_size - 1
]
# 如果没找到,把新刀压进栈
if not(is_tool_in_stack),
[
tool_number = push(1, stack_result, 0)
]利用opinfo函数抓取Mastercam里的真实刀具数据,然后调用上面的堆栈逻辑。
# 获取刀具参数
pget_tool_parameters(op_identity)
tool_number = opinfo(47, op_identity, 1) # 刀号
tool_offset = opinfo(49, op_identity, 1) # 补正号
tool_length_offset = opinfo(50, op_identity, 1) # 长度补正
tool_diameter = opinfo(10005, op_identity, 1) # 直径
tool_corner_radius = opinfo(10006, op_identity, 1) # 圆角
# 输出清单主函数
pwrite_tool_info
stream_idx = 1
stream_op_id = streaminfo(1, stream_idx) # 获取第一个操作ID
while stream_op_id <> -99999, # 循环所有操作
[
pget_tool_parameters(stream_op_id) # 抓数据
padd_tool_to_stack # 扔进堆栈去重
stream_idx = stream_idx + 1
stream_op_id = streaminfo(1, stream_idx)
]
# 输出堆栈里剩下的唯一刀具
stack_size = pop(1, stack_result, 0)
while stack_size > 0,
[
output_tool_number = pop(1, stack_size, 5)
"(Tool Info: T", *output_tool_number, " D", *output_tool_diameter, " R", *output_tool_corner_radius, ")", e$
stack_size = stack_size - 1
]在pheader$(程序头)里直接调用pwrite_tool_info就行。
有个坑得提醒:堆栈深度。代码里fstack 1 5意思是堆栈1最多能存5把刀。如果你一个程序用了10把刀,这里就要改成fstack 1 10,不然多出来的刀会被丢掉。
还有个冷知识:-99999是Mastercam的终止符。当streaminfo找不到下一个操作时,就会返回这个数,用来结束循环。别随便改这个数,不然代码会死循环,Mastercam直接卡死。
这套逻辑我在2026版里测过,输出效果干净利落,再也不用看那些重复的T1、T1、T1了。

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。