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

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值