PowerMill二次开发(宏编程)
时间: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=1bool boo=1while boo {CREATE TOOL ; ENDMILL EDIT TOOL ; DIAMETER $re$re=$re+1if 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 {//将遍历的刀具名称给到namestring 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,输出结果还是1int i=1print=iprint=i+i//实型real b=123.366print $b//有两中输出方式print=b//字符串类型string str ="123"print = strprint = 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() {//提前创建好一个毛坯,将毛坯信息给到objobject obj=block//声明定义了一个实型,接收毛坯的Z方向的最大值real nub=obj.limits.zmax//将数值打印出来print=nub
}
运行上面宏之前,先创建好一个毛坯,上面宏命令目的是求毛坯的Z 方向的大小。
5)变量的命名规则

6)变量的作用范围


其实上面讲的是,变量的作用范围,有点编程基础的同学,应该很容易懂,但是一点其他编程不一样就是有一个就近原则,当使用变量的时候(print),会就近寻找附件的变量。
六、数据类型转换

int a=1
string bt=$a+"first"
print $btstring 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.005print $tp.namebreakcase 0.006print $tp.namebreakdefaultprint "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.namebreak}
}
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.nameif $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"breakcase 1message info "第二个宏"breakcase 2message info "第三个宏"breakdefaultmessage 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,包含就返回大于等于1if position(tp.Name ,"aa") >= 0 {//弹出信息对话框包含aamessage 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)//判断是否包含AAif position ($b,"AA") >=0 {string a = replace($b,"AA","ASHUKONG")rename toolpath $tp.Name $astring 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 $eint 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-"+brename 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.NamFILE 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 mmreal 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.NameCALL ssss(BO.Name) }
}
3)input,ouput类型变量
默认情况下是input类型,可以不添加,output类型,需要添加,调用子函数需要在前面加call
//子函数,output会影响到全局变量
FUNCTION TEST( real ainput, output real aoutput) {print $ainput$ainput = 5print $aoutput$aoutput = 0print $aoutput
}
//主函数
FUNCTION main() {real par1 = 2real par2 = 1CALL TEST(par1,par2)print $par1print $par2
}
宏命令结果是:

4)函数库
//导入函数库的路径,就可以用子函数了
INCLUDE "C:\Users\Administrator\Desktop\PowerMILL\函数库.inc"
FUNCTION MAIN (string tt) {FOREACH BO IN FOLDER(tt) { ACTIVATE BOUNDARY $BO.NameCALL 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.Namestring m = "copy " + ent.RootType +" " +ent.Name
DOCOMMAND $m}function main() {entity b = entity("boundary","2")call cp(b)
}
二十三、右键菜单与自定义宏命令讲解

例3如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。提示:里面的代码要用半角的英文输入状态。调出PM的命令窗口(开始----回显命didi
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!



