时间:2023/6/29 作者:飞天小鹏&泡芙 地点:广东广州
一、宏的定义
宏是一个能自动运行PM操作的命令文件,该文件中包含一系列的PM命令
创建宏的方式:
1.在PM中录制
2.在文本编辑器中输入命令创建宏
3.宏的扩展方式是.mac(扩展名)
宏的类型:
1.初始化宏(系统宏,简单一点就是系统自带的宏)
2.用户自定义宏(自己手写的宏,自己录制的宏)
1.在PM中记录宏
右键资源管理器中“宏”按钮,选择“记录”,弹出对话框,选择你要保存宏的位置。(这时候“宏”按钮,会出现一个红色的圈,表示开始录制。创建三把刀具,创建完成后,右键“宏”按钮,点击停止(记录完成宏)。去打开你保存宏的位置,找到你那个文件,需要将后缀名改成(.mac)。我用的是2021版的PowerMill,自己就有后缀名,老的版本是自己需要添加后缀名的。
2.在PM中运行宏
把刚刚上文创建的三把刀具删除,右键资源管理器中“宏”按钮,选择“运行”,弹出对话框选择你的宏文件(.mac)。接下来PM会自己创建出你刚刚删除的三把刀具。
3.在PM中编辑宏
右键资源管理器中“宏”按钮,如图1,选择你刚刚创建的宏名字,右键选择编辑(选择用记事本打开如图2)。
图1
图2
解释一下记事本中的命令语句:
CREATE TOOL ;ENDMILL FORM TOOL:创建端铣刀
RENAME TOOL “1” “D1”:更改名字,将名字:1,改成名字:D2
EDIT TOOL “D1” DIAMETER "10":将名字为D1的刀具直径改成10
TOOL ACCEPT:刀具接受(应该是编辑好刀具,按确定按钮的意思)
我们编辑修改一下,里面代码,让它更加有通用性,例如第二句代码(更改名字,将名字:1,改成名字:D2),假如原来PM里面就有一个名字:1的刀具,这样的话就会把原来刀具更改,我们只需要创建新的刀具就好,编辑完后的代码下:
CREATE TOOL ; ENDMILL
RENAME TOOL; "D1"
EDIT TOOL "D1" DIAMETER "10"
CREATE TOOL ; BALLNOSED
RENAME TOOL ; "D2"
EDIT TOOL "D1" DIAMETER "8"
CREATE TOOL ; TIPRADIUSED
RENAME TOOL ; "D3"
EDIT TOOL "D1" DIAMETER "6"
message info "创建刀具成功!"
编辑完后,保存,运行刚刚修改好的通用宏。PM会显示一个窗口:创建刀具成功!,如果出现乱码的情况,需要将记事本的格式UTF-8改成ANSI格式(具体修改方法如图3)
图3
二、创建自定义宏(宏命令不分大小写)
1.使用表达式
2.使用循环语句控制宏
3.使用关系运算符和逻辑运算符
4.在宏中添加PM命令
5.在宏中添加注释
创建一个记事本文件,修改后缀名(.mac),"//"双斜杠是注释,提示:里面的代码要用半角的英文输入状态。调出PM的命令窗口(开始----回显命令)如图4,点出命令窗口就是为了方便我们编辑自定义宏,我们不需要记住那些宏命令,当我们操作PM的时候,例如创建一把刀具,命令窗口就会对应显示创建刀具的宏命令。说明一下,大写的是PM命令,小写的是自己定义的变量。注意!注意!注意!重要的事情说三次,你一定要按照我下面的代码用半角英文输入法,而且哪里有空格,没有空格都必须按照我的写,不然会报错,我就是少了一个空格害我,找问题找了半天。
//主函数
function main() {
real re=1
bool boo=1
while boo {
CREATE TOOL ; ENDMILL
EDIT TOOL ; DIAMETER $re
$re=$re+1
if re>12 {
$boo=0
}
}
}
解释上面代码意思:
function main():意思就创建一个main的主函数入口
real re=1:声明定义一个直径变量re,赋值是1
bool boo=1:声明定义一个布尔变量boo,赋值是1
while boo:循环语句
CREATE TOOL ; ENDMILL :创建一把端铣刀
EDIT TOOL ; DIAMETER $re:编辑刀具的直径为定义的变量re
if re>12:if语句当re大于12的时候,就将布尔值boo赋值为0
上面的代码意思是,创建十二把端铣刀
三、在宏中调用宏
function main() {
//获取当前激活的刀具
entity en =entity("tool","")
//获取当前激活刀具的名称
string name=en.name
//获取当前激活刀具的直径
real re =en.diameter
//将获取到的刀具直径转换为int类型
int i=int(re)
//将int i转换为string类型
string str=string(i)
//更改一下str的名字
$str ="D"+$str+"R0"
//调用PM命令更改刀具名称
RENAME Tool $name $str
{
简单宏.mac
代码解释的话,就不用了,上面每一句注释都非常清楚,上面代码依然是创建一个记事本文件,更改后缀名(.mac)。右键资源管理器”宏“,选择”运行“,上面代码的作用是将激活的刀具名字更改为D+直径+R0。注意:有些版本的PM可能出现中文就会出现,我就是这样出现中文就会报错,所以上面代码运行前,我会把所有注释都删除掉,在运行宏。
function main() {
//将所有的刀具放到list容器中
entity list ens=folder("tool")
//遍历所有的刀具名称
foreach en in ens {
//将遍历的刀具名称给到name
string name=en.name
//激活遍历到的刀具
ACTIVATE TOOL $name
//双引号里面填写的是上面简单宏文件所在的位置,目的是宏中调用宏
macro "D:\BaiduNetdiskDownload\952-PowerMILL2021视频教程\PowerMILL2021视频教程素材第一章\1.4简单的宏.mac"
}
}
复杂的宏
上面代码依然是创建一个记事本文件,更改后缀名(.mac)。右键资源管理器”宏“,选择”运行“,代码的作用是实现一个宏中调用另外一个宏,实现给每个刀具更改名字。注意:有些版本的PM可能出现中文就会出现,我就是这样出现中文就会报错,所以上面代码运行前,我会把所有注释都删除掉,在运行宏。要是出现乱码的情况,还是将格式UTF-8改成ANSI格式。老是另存比较麻烦,等我找到解决方法,再告诉大家!!!
四、常量
function main() {
//打印出pi的常量值
print =pi
//将pi赋值
string pi ="hello"
//打印出pi的值
print =pi
}
上面打印结果如下:
可以再上面命令窗口处看到有两个打印结果,3.144593,hello
function main() {
//crlf是换行的意思
message info "中国你好" +crlf+"世界你好"
}
上面的代码结果如下:
五、
1)变量类型
function main() {
//整型:如果你将i赋值为1.6,输出结果还是1
int i=1
print=i
print=i+i
//实型
real b=123.366
print $b//有两中输出方式
print=b
//字符串类型
string str ="123"
print = str
print = str + str
}
上面代码,是简单的使用变量的类型,相信有点编程基础的同学,一看就知道代码的结果。结果为:1,2,123.366,123.366,123,123123
2)变量的赋值
语法:变量类型 变量名 = value
变量名正确的命名方式
见闻知意,例如:string model_name
3)entity讲解
上面的英文解释,toolpath----刀具路径,tool----刀具,boundary------边界,level-----层,pattern----参考线,model-----模型,ncprogram-----NC程序
4)object讲解
1.使用该变量可以获取一个预定义的PM参数集合
2.应用在Block(毛坯)、Connection(刀路连接)
3.只能创建列表
function main() {
//提前创建好一个毛坯,将毛坯信息给到obj
object obj=block
//声明定义了一个实型,接收毛坯的Z方向的最大值
real nub=obj.limits.zmax
//将数值打印出来
print=nub
}
运行上面宏之前,先创建好一个毛坯,上面宏命令目的是求毛坯的Z 方向的大小。
5)变量的命名规则
6)变量的作用范围
其实上面讲的是,变量的作用范围,有点编程基础的同学,应该很容易懂,但是一点其他编程不一样就是有一个就近原则,当使用变量的时候(print),会就近寻找附件的变量。
六、数据类型转换
int a=1
string bt=$a+"first"
print $bt
string bt2=real(a)+"first"
print $bt2
print $a
上面宏命令代码的结果如下:
第二个print输出,之前进行real(a)的类型转换,a的类型变成real实型,所有第二个输出,结果1.0first,第三个结果,我们可以看到,在string bt2=real(a)+"first"表达式中,转换了类型,只是只是局部的影响,不会影响到外面a的类型。
七、表达式与运算符
1)表达式
表达式的含义:由常量,变量,运算符组成的语句,在宏语言中可作为条件使用
int a = 1
int b = 2
int c = a+b
//表达式声明变量
real factor = 2
real value = Tolerance*factor
print $value
//表达式进行赋值
$Stepover = Tool.Diameter * factor
print $Stepover
//作为条件语句进行判断
ENTITY TP =ENTITY ("TOOLPATH","AAA")
IF $TP.Tolerance==0.1 {
print $TP.Name
}
上面宏代码:表达式由常量,变量,运算符组成的语句,在宏语言中可作为条件使用
2)运算符
八、控制语句
1)控制语句的介绍
选择语句:选择语句是指根据条件来选择一个任务分支的语句的统称,实现分支程序设计
循环语句:循环语句是指用来快速完成重复和繁琐工作的编程语句
2)if 语句详解
function main () {
//创建一个列表,将刀具路径保存到列表ens中
entity list ens=folder("toolpath")
//遍历列表
foreach en in ens {
//en.Strategy表示策略,判断策略是否是raster平行精加工,如果就打印加工刀具路径名称
if en.Strategy == "raster" {
PRINT $en.Name
}
}
}
//if语句的判断,判断a是否小于5
int a=1
int b=2
if a<5 {
print $a
}
print $b
上面代码是一个简单的if语句的使用,在这里就不多说了,最重要的是if语句的括号问题,要记住括号按照我的位置放,不然会出错。
3)if-else语句详解
//这是一个简单的语法例子代码
int a =3
int b =5
int c =6
if a<5 {
print $a
} else {
print $b
}
print $c
//下面代码是一个实际PM的例子代码
//遍历所有刀具
foreach tp in folder("tool") {
//判断类型是否为端铣刀
IF $TP.Type == "end_mill" {
print $tp.Name
} ELSE {
print $tp.Type
}
print $tp.diameter
}
4)if-elseif-else语句详解
//if-elseif-else 简单用法
int a=1
int b=2
int c=3
int d=4
if a>0 {
print $a
} elseif b>1 {
print $b
} else {
print $c
}
print $d
上面的宏代码结果是:1和4
//创建两个指针,指向两把刀
entity em = entity("tool","ENDMILL-10")
entity bm = entity("tool","ENDMILL-6")
//判断第一把刀类型是否等于端铣刀
if $em.type == "end_mill" {
print $em.name
} elseif $bm.type == "ball_nosed" {
print $bm.name
} else {
print $bm.type
}
print $em.type
上面宏代码的结果是:ENDMILL-10和end_mill
5)switch语句详解
//遍历所有的刀具路径
foreach tp in folder ("toolpath") {
switch $tp.tolerance {
case 0.005
print $tp.name
break
case 0.006
print $tp.name
break
default
print "switch”
}
}
6)foreach循环详解
//循环输出1,2,3,4,5
int list ll = {1,2,3,4,5}
foreach cc in ll {
print $cc
}
循环输出1,2,3,4,5
//循环输出刀具策略名称
foreach nana in folder ("toolpath") {
print $nana.name
}
7)while循环讲解
//循环输出
int a =5
while a<10 {
print $a
$a=a+1
}
上面宏代码是:5,6,7,8,9
//循环判断公差是否等于0.005
foreach tp in folder ("toolpath") {
while $tp.tolerance ==0.005 {
print $tp.name
break
}
}
8)do-while循环讲解
//输出为:3,4,5
int a =3
do {
print $a
$a = a+1
} while a<6
print "DOWHILE"
//实际例子
ENTITY TP = ENTITY ("toolpath","AA")
DO {
print $tp.Name
} while $tp.Tolerance == 0.05
print "dowhile"
9)break语句讲解
10)continue语句讲解
11)return语句讲解
九、对话框
1)暂停对话框
//弹出一个暂停对话框
MACRO PAUSE "请选择局部位置"
//下面三行是PM宏命令,表示设置毛坯
FORM BLOCK
EDIT BLOCK RESET
BLOCK ACCEPT
2)输入对话框
string a = "输入刀具路径名称"
string i = ""
//设置对话框的标题是a,将对话框输入的内容赋值给i
$i = input $a
//定义一个指针指向名字为BB的的策略
ENTITY TP = ENTITY ("TOOLPATH","BB")
//更改刀具的名字
RENAME TOOLPATH $TP.Name $i
3)消息对话框
string a = "消息对话框"
//消息对话框
message info $a
//警告对话框
message warn $a
//报错对话框
message error $a
4)询问对话框
//定义一个a是为了设置询问对话框的标题
string a = "Do you want to modify it again"
//询问对话框需要定义声明一个布尔值
bool i = 0
//do-while循环,上面已经学过了,这里就不解释了
DO {
//下面四行代码是之前案例,就是设置毛坯的意思
MACRO PAUSE "请选择局部位置"
FORM BLOCK
EDIT BLOCK RESET
BLOCK ACCEPT
//询问对话框,通过弹出对话框,选择是否,来决定i值是0或1
$i = QUERY $a
} WHILE $i
5)选择对话框
//声明定义一个空字符串
string str = ""
//下面是单选对话框的宏代码,选择你的刀具
$str = input entity tool "请选择一个刀具"
//定义一个指针
entity tl = entity ("tool",$str)
//修改你选择的刀具名称为kuang
rename tool $tl.name "kuang"
//宏代码结合了单选和多选,先进行单选对话框,选择一个刀具路径
string a = ""
$a = input entity toolpath "请选择刀具路径"
//将选择到的刀具路径公差赋值给$tolerance
$tolerance = entity ("toolpath",$a).tolerance
//多选对话框,返回值是一个list
entity list ll = input entity multiple toolpath "请选择刀具路径"
//遍历list
foreach b in ll {
string c=b.name
if $c == $a {
continue
}
//将选择好的刀具路径公差赋值给多选的公差
EXPLORER SELECT Toolpath $c NEW
//修改公差
edit par selected tolerance
}
6)自定义选择对话框
//声明定义一个string数组
string array ar[] = {"第一个宏","第二个宏","第三个宏"}
//这是单选对话框,里面的选项是上面定义的数组
int a = input choice $ar "请选择一个宏运行"
//switch语句
switch $a {
case 0
//这是选择之前定义好的宏命令
macro "D:\BaiduNetdiskDownload\哔哔PM教程图档课件素材分享\PM2018变量宏教程配套课件\配套课件\5.1宏暂停讲解.mac"
break
case 1
message info "第二个宏"
break
case 2
message info "第三个宏"
break
default
message info "meiyou"
}
7)文件选择对话框
string str = ""
$str = fileselect "请选择一个文件"
十、数学函数与统计函数
1)通用函数
//对数值,开平方,结果是2.0
real a = sqrt(4)
print $a
//对竖直,去绝对值,结果是5.0
real b = abs(-5)
print $b
//返回-1,0,1根据数值,正数返回1,负数返回-1,零返回0
real c = sign(0)
print $c
//第一个数,与第二个数差值是否跟第三个数相等,相等返回0,不相等返回1
real d = compare(1,1,1)
print $d
//案例:判断工件的绝对坐标,x对应的是不是长边
//取工件的x最大值和最小值
real xm = Block.Limits.XMax
real xn = Block.Limits.XMin
//取工件的y最大值和最小值
real ym = Block.Limits.YMax
real yn = Block.Limits.YMin
//取绝对值
real xl = abs(xm-xn)
real yl = abs(ym-yn)
//判断两个值
if xl < yl {
//消息对话框
message info "绕z轴旋转90度"
}
2)三角函数和统计函数
//求sin30度
real a = sin(30)
print $a
//求cos30度
real b = cos(30)
print $b
//求tan45度
real c = tan(45)
print $c
//创建一个列表
real list ll = {1.0,2.0,5.0,9.0,8.0}
//返回最大值
real a = max (ll)
/返回最小值
real b = min (ll)
print $a
print $b
十一、字符串函数
1)int length(string str)
string a = "Ashukong"
string b = "123456"
string c = a + b
//打印字符串的长度
print = length ($c)
2)position讲解
//第一种:返回ko在字符串中的位置
print = position ("ASHUKONG","KO")
//第二种:从第六个字符开始寻找
print = position ("ASHUKONGKOKO","KO",6)
//遍历里面的刀具策略
foreach tp in folder ("toolpath") {
//判断策略名称是否包含aa,包含就返回大于等于1
if position(tp.Name ,"aa") >= 0 {
//弹出信息对话框包含aa
message info "包含AA"
}
}
3)replace讲解
//下面宏代码的意思是,用123456替代kong
print = replace("Ashukong","kong","123456")
//案例:遍历刀具策略
foreach tp in folder ("toolpath") {
//将ashukong替代AA,替代是区别大小写的,replace不是真正的改变策略名字
string a = replace($tp.Name,"AA","ashukong")
rename toolpath $tp.Name $a
}
4)substring讲解
//返回字符串类型,从第二位开始返回四位字符
string a = substring ("Ashukong",2,4)
//结果是:hyko
print = $a
//a的长度是:4
print = length($a)
5)ucase和icase讲解
//声明定义两个字符串
string a = "ashukong"
string b = "POWERMILL"
//将字符串转换为大写
print = ucase(a)
//将字符串转换为小写
print = lcase(b)
//案例:上面那个案例replace因为是不区分大小写
foreach tp in folder ("toolpath") {
//将策略名称全部转换为大写
string b = ucase ($tp.Name)
//判断是否包含AA
if position ($b,"AA") >=0 {
string a = replace($b,"AA","ASHUKONG")
rename toolpath $tp.Name $a
string c = lcase($tp.Name)
rename toolpath $tp.Name $c
}
}
6)itrim讲解
string a = " ashukong "
string b = a + "//"
print $b
//把前面空格去掉
print = ltrim($a)+"//"
//把后面空格去掉
print = rtrim($a)+"//"
//前后空格都去掉
print = trim($a)+"//"
7)tokens讲解
string a = "aa bb cc"
//默认空格为分隔符
string list ll = tokens(a)
reach c in ll {
print $c
}
string a = "1:2:3:4"
//设置“:”为分隔符
string list ll = tokens(a,":")
foreach c in ll {
print $c
}
十二、列表函数
1)components讲解
//components是一个存储组的列表
foreach aa in components(entity("Group","1")) {
//lcase变成小写,roottype:根类型
if lcase(aa.RootType) == "toolpath" {
print $aa.Name
}
}
2)fill讲解
//填充3个元素都是abc的数组
string array str[] = fill(3,"abc")
print par "str"
//填充5个元素都是5的列表
int list aa = fill(5,5)
print par "aa"
上面宏代码中,记得上面列表的输出前加个par,列表跟上面变量输出不一样
3)folder讲解
//遍历所有刀具策略
foreach aa in folder("Toolpath") {
print $aa.Name
}
//遍历所有刀具
foreach aa in folder("Tool") {
print $aa.Name
}
课外知识:
MachineTool(机床)
NCProgram:NC程序
Toolpath:刀具路径
Tool:刀具
Boudary:边界
Pattern:参考线
Featureset:特征组
Workplane:工作平面
Level:层
Model:模型
StockModel:残留模型
Group:组
上面的宏命令都是用在floder的对象的(上面宏命令区分大小写)
4)is_empty,menber,+三者的用法讲解
int list ll = {1,2,3}
int list aa = {4,5,6}
//判断列表是否为空,空就返回1,非空返回0
print = is_empty(ll)
//判断列表是否包含特定的值,包含返回1,不包含返回0
print = member(ll,2)
print = member(ll,4)
//将两个数值,或者列表合并
int list mm = ll+aa
print par "mm"
5)remove_duplicates和set_union用法
int list aa = {1,2,3,4,5,1,2,1}
int list bb = {1,2,1,5,5,6}
//将重复的元素移除,返回移除的数量
print = remove_duplicates(aa)
//将两个字符串组成一个新的字符串,移除重复的元素,返回列表
int list cc = set_union(aa,bb)
//结果是:1,2,3,4,5
print par "cc"
6)intersection和subtract用法
int list aa = {1,2,3,4,5}
int list bb = {3,4,5,6,7}
//将两个列表中重复的元素,重新组成新的列表
int list cc = intersection (aa,bb)
//结果:3,4,5
int par "cc"
//返回第一个列表中包含,同时第二个列表中不包含的元素
int list dd = subtract(aa,bb)
//结果是:1,2
print par "dd"
7)添加和移除元素
int list a = {1,2,3,4,5,6}
//添加元素在列表的开始位置,返回值是列表数量:7
print = add_first(a,9)
//打印结果:9,1,2,3,4,5,6
print par "a"
//添加列表到结束位置,返回值是列表数量:7
print = add_last(a,6)
//打印结果:1,2,3,4,5,6,6
print par "a"
//移除元素在列表的开始位置,返回值是移除元素:1
print = remove_first(a)
print par "a"
//移除元素在列表的结束位置,返回值是移除元素:6
print = remove_last(a)
print par "a"
//移除列表中的指定值,如果有这个元素就返回1,没有就返回0
//只移除一个元素,重复的不移除
print = remove(a,2)
print par "a"
//案例:将参考线名称,遍历添加到一个列表中
string list b = {}
foreach c in folder("pattern") {
int s= add_first(b,c.Name)
}
print par "b"
8)extract和filter讲解
//用一个指针列表指向刀具(名称用string,刀具用entity,因为刀具包含了很多信息)
entity list a = extract(folder("toolpath"),"tool")
foreach t in a {
print $t.name
}
//打印刀具路径里面用的的刀具名称
string list b =extract(folder("toolpath"),"name")
print par "a"
//根据表达式,提取元素
entity list b = filter (folder("toolpath"),"strategy == 'drill'")
foreach tl in b {
print $tl.Name
}
//利用表达是,提取大于2的元素
real list n = {1.0,2.0,3.0,4.0,9.0}
//this是继承上面list元素
real list m = filter (n,"this>2")
print par "m"
9)sort,reverse讲解
//用升序降序排列
int list a ={2,6,8,1,5}
int list b =sort(a)
print par "b"
int list c =reverse(a)
print par "c"
//按照刀具路径名字进行排序
entity list a = sort(folder("toolpath"),"name")
foreach tl in a {
print $tl.Name
}
//按照刀具路径里面的刀具直径排序
entity list b = sort(folder("toolpath"),"Tool.Diameter")
foreach t in b {
print $t.Name
}
十三、路径函数
1)pathname讲解
entity a = entity("toolpath","BB")
//打印刀具路径BB所在的位置
string b = pathname(a)
print $b
//跟上面代码一样的表达
print = pathname("toolpath","BB")
2)dirname,basename讲解
entity a = entity("toolpath","DD")
string b = pathname(a)
string c = dirname(b)
//打印前缀,不打印DD
print $c
string d = basename(b)
//打印DD
print $d
3)active_folder,get_folder,project_pathname讲解
//返回当前激活文件夹的名称
string a = active_folder()
print $a
//返回一个列表,获取边界下面的文件夹名称
string list b = get_folders("boundary")
//遍历打印文件夹名称
foreach t in b {
print $t
}
//返回当前项目文件路径:默认值0全部路径,1输出当前选项名称
print = project_pathname(1)
十四、函数参数
1)active讲解
//active的返回值是布尔值
print par "active(tool.TipRadius)"
if active(tool.TipRadius) {
message info "刀尖圆角激活"
} else {
message info "刀尖圆角没有激活"
}
2)locked讲解
//判断激活的刀具是否锁定,返回布尔值
print par "locked(tool.Diameter)"
//改变刀具路径处于未计算状态
Edit par NOQUERY tool.Diameter "5"
if locked(tool.Diameter) {
message info "刀具直径被锁定"
}
3)size讲解
//返回刀具路径数量
print = size(folder("toolpath"))
//下面返回的是枚举参数类型
//Tool.Type CutDirection Strategy
//提取枚举参数的值到一个数组里面
string array a[] = values(Tool.Type)
print par "a"
//用于选择对话框
int c= input choice $a "请选择加工方向"
十五、日期与时间函数
1)time讲解
//获取当前宏的时间,单位为秒
int a = time()
print $a
//案例:输入计算前,计算后的时间差
INVALIDATE TOOLPATH;
int a = time()
EDIT TOOLPATH ; CALCULATE
int b = time()
int c = b-a
string d = "刀具路径计算时间为:"+ $c + "秒"
message info $d
2)local_time,utc_time讲解
int a = time()
object b = local_time(a)
int e = local_time(a).hour
print par "b"
message info $e
int f = utc_time(a).hour
message info $f
//获取当前系统时间
int a = time()
//获取时间
object b = local_time(a)
//格式是年月日时分秒
string f = local_time(a).timestamp
print par "b"
message info $f
//需要下面的格式输出
//16:56:48
//以”-“为分隔符,将字符串分开
string list aa = tokens(f,"-")
//输入看看分开结果
print par "aa"
//按照下标输出需要的内容
string cc = aa[3] + ":" + aa[4] + ":" + aa[5]
message info $cc
十六、序列函数
object b = make_sequence(2,2,3)
print par "b"
string c = next_in_sequence(b)
print $c
string d = next_in_sequence(b)
print $d
string e = next_in_sequence(b)
print $e
string f = next_in_sequence(b)
print $f
上面宏命令结果如图:
object a = make_sequence(1,1,4)
//遍历每个刀具路径,给每个刀具路径改名
foreach tp in folder("Toolpath") {
string b = next_in_sequence(a)
string c = "dg-"+b
rename toolpath $tp.name $c
}
上面宏命令结果如下图:
十七、基于Entity的函数
1)entity_exists()
//判断是否有刀具路径激活,返回布尔值
bool a = entity_exists(Tool)
print $a
//第二种方法,不需要激活,可以判断不激活的刀具路径
bool b = entity_exists(entity("Toolpath","dg-0002"))
print $b
//案例:
if entity_exists (Workplane) {
message info "存在一个激活的坐标系"
} else {
message info "不存在一个激活的坐标系"
}
2)new_entity_name的讲解
//预判一下,下一把刀具的名称
string a = new_entity_name("Tool")
print $a
//创建刀具,验证刀具
create tool;
//预判一下,指定刀具后,复制刀具的名称,需要先激活需要复制的刀具
string b = new_entity_name("Tool","aa")
print $b
//创建刀具,验证刀具
copy tool;
3) geometry_equal和segments用法
//声明定义两个不同的指针指向刀具路径
entity aa = entity("Tool","aa")
entity bb = entity("Tool","aa_1")
//判断是否相等
bool a = geometry_equal(aa,bb)
print $a
//案例判断刀具是否相等
if a == 1 {
message info "刀具尺寸相同"
} else {
message info "刀具尺寸不相同"
}
//判断边界有多少条
entity bu = entity("Boundary","1")
int a = segments(bu)
print $a
4) limits讲解
//声明定义一个指针,指向模型
entity m = entity("model","3D_Pockets")
//返回一个实型数组
real array a[] = limits("model","3D_Pockets")
print par "a"
//因为公差问题,调整公差
print = round(a[0],3)
print = round(a[2],3)
print = round(a[5],3)
//查看刀具路径的xy最大值最小值
entity m = entity("Toolpath","")
real array b[] = limits(m)
print par "b"
十八、评估函数与条件函数
1)evaluate讲解
string a = "5*5"
//评估函数作用就是,将一个字符串表达式计算出来
print = evaluate("a")
if evaluate("1<2 and 3>1") {
message info "这是正确的"
}
2)select讲解
//如果1<2为真就返回3*5,否则返回5-3
print = select(1<2,3*5,5-3)
//返回实型,激活刀尖圆角端铣刀,判断
real r = select(active(Tool.TipRadius),Tool.TipRadius,Tool.Diameter/2)
print $r
十九、文件和文件夹操作
1)MKDIR讲解
//创建文件夹
MKDIR "C:\Users\Administrator\Desktop\PowerMILL\456"
2)复制,删除,文件,文件夹
//删除文件夹
DELETE DIRECTORY "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\789"
//复制文件夹,前面是想要复制的文件夹,后面是文件夹复制位置
COPY DIRECTORY "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM" "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\456"
//删除文件
DELETE FILE "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\DD.txt"
//复制文件,复制内容,从a内容到b内容
COPY FILE "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\CC.txt" "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\AA.txt"
3)返回宏工作路径,改变工作路径
//改变当前工作环境的路径
cd "C:\Users\Administrator\Desktop\PowerMILLºê½Ì³Ì\ÅäÌ׿μş\ceshi\456"
//打印当前工作路径
print = pwd()
//恢复工作路径
//cd
4)判断文件,文件夹是否存在,函数返回一些路径下的文件,文件夹
//判断文件是否存在,返回布尔值
bool a = file_exists("C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\ll.txt")
print $a
//判断文件夹是否存在,返回布尔值
bool b = dir_exists("C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\ll")
print $b
//files返回的是文件(在最后加双引号规定返回文件类型),dirs返回文件夹,all返回所有
//在上面三个参数后加”+“,可以更加深入的将里面文件夹里面的东西进行查找
string list a = list_files("all+","C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM")
foreach i in a {
print $i
}
二十、文件读写讲解
1)文件打开,设置句柄,关闭文件句柄
//打开一个文件,for 后面是类型(WRITE写入,READ读取,APPEND添加),as后面是句柄(意思就是文件的代号)
FILE OPEN "C:\Users\Administrator\Desktop\PowerMILL\ceshi\123\MM\CC.txt" FOR WRITE AS CC
//关闭一个文件,并且释放文件句柄
FILE CLOSE CC
2)文件的读写
//当你打开一个不存在的文件的路径,它会自动帮你创建
FILE OPEN "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\ashukong.txt" FOR APPEND AS CC
//声明定义列表,数组,实型
string list aa = {"hello","word","english","单独写入"}
int array bb[] = {1,2,3,4,5}
real ee = 16
//写进去文件里面
FILE WRITE $bb TO CC
FILE WRITE $aa TO CC
FILE WRITE $ee TO CC
//可以利用索引号进行写入
FILE WRITE $aa[3] TO CC
//关闭文件,关闭文件句柄
FILE CLOSE CC
3)文件读取案例
//循环写入刀具路径名称
FILE OPEN "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\ashukong2.txt" FOR WRITE AS CC
FOREACH TP IN FOLDER("toolpath") {
string a = $tp.Nam
FILE WRITE $a TO CC
}
FILE CLOSE CC
4)文件读入案例
FILE OPEN "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\ceshi\123\MM\ashukong2.txt" FOR READ AS CC
string list aa = {"hello","word","english","单独写入"}
int array bb[] = {1,2,3,4,5}
real ee = 16
FILE READ $bb FROM CC
FILE READ $ee FROM CC
FILE READ $aa FROM CC
file close CC
二十一、主函数和子函数的讲解
1)主函数的调用
第一种方法是通过PM下面命令窗口,进行调用:Macro 函数的.mac文件
FUNCTION main (string name real dim) {
EDIT TOOL $name DIAMETER $dim
}
第二种方法是通过宏调用宏的方法进行
macro "C:\Users\Administrator\Desktop\PowerMILL宏教程\配套课件\17.1PM宏主函数与子函数讲解1-2.mac" 6 "d10"
2)子函数
//子函数函数
FUNCTION ssss (string AA) {
//声明定义两个实型,一个是直径,一个是边界的直径
real dd = 1 mm
real CC = ENTITY ("Boundary",AA).Tool.Diameter
//判断是否小于指定直径
EDIT BOUNDARY $AA SELECT AREA LT ${5*CC}
//删除边界
DELETE BOUNDARY $AA SELECTED
//不删除,扩大边界
EDIT BOUNDARY $AA OFFSET $dd
//EDIT BOUNDARY $AA OFFSET ${-2*dd}
}
//主函数
FUNCTION MAIN (string tt) {
FOREACH BO IN FOLDER(tt) {
ACTIVATE BOUNDARY $BO.Name
CALL ssss(BO.Name)
}
}
3)input,ouput类型变量
默认情况下是input类型,可以不添加,output类型,需要添加,调用子函数需要在前面加call
//子函数,output会影响到全局变量
FUNCTION TEST( real ainput, output real aoutput) {
print $ainput
$ainput = 5
print $aoutput
$aoutput = 0
print $aoutput
}
//主函数
FUNCTION main() {
real par1 = 2
real par2 = 1
CALL TEST(par1,par2)
print $par1
print $par2
}
宏命令结果是:
4)函数库
//导入函数库的路径,就可以用子函数了
INCLUDE "C:\Users\Administrator\Desktop\PowerMILL\函数库.inc"
FUNCTION MAIN (string tt) {
FOREACH BO IN FOLDER(tt) {
ACTIVATE BOUNDARY $BO.Name
CALL shanchu(BO.Name)
}
}
你可以将你认为好用的宏命令写成子函数,将它放到.inc的函数库 文件中
二十二、辅助命令讲解
1) DOCOMMAND讲解
function cp (ENTITY ent) {
//string a = new_entity_name(ent.RootType,ent.Name)
//copy boundary $ent.Name
//copy $ent.RootType $ent.Name
string m = "copy " + ent.RootType +" " +ent.Name
DOCOMMAND $m
}
function main() {
entity b = entity("boundary","2")
call cp(b)
}
二十三、右键菜单与自定义宏命令讲解
例3如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。提示:里面的代码要用半角的英文输入状态。调出PM的命令窗口(开始----回显命didi