PowerMill二次开发(宏编程)

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=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

相关文章

卡塔尔世界杯闭幕式和烟花创意秀赏析!

office365怎么登陆 07-07

steam怎么调成中文 steam改语言的操作方法【详解】

beat365手机版官方网站正规 07-04

世界杯历史上球迷打架事件的背后(狂热与暴力交织)

beat365手机版官方网站正规 07-02

如何拍摄 360 度照片? ➡️

beat365手机版官方网站正规 07-06