PC-DMIS 2019 R2 脱机编程和 Python 二次开发 第1篇(研究记录中)

最近更新于 2024-12-15 20:28

前言

2024.12.4
公司暂时没有接新品了,我也基本没有什么大工程的工作要做了,手头上的工作也逐步开始完结,趋向于空闲了,可以开始推进学习进程了。现在的计划目标是学习数控车床,加工中心,三坐标,先起步车床和三坐标吧,这里就作为三坐标的学习记录。
现在的感觉就是“开头难”,自学起步挺难的,不像以前搞计算机编程,要学习的话,网上大把的资料,各语言也有很多共同点,有一门基础上手其它的很快 ,只要掌握基本语法,很快就能动手。搞机加工,感觉专业壁垒很高,知识散而杂,网上可以查到的资料也少,起步都要懵逼很久,就感觉摸不着头脑,找不到方向,不知道从哪里开始,要做什么?
海克斯康的软件相关的资料就很少,遇到问题在百度、必应、谷歌搜中文基本没有,搜英文也没有,去海克斯康的社区搜英文,个别能遇到相同的提问,但是没有合适的回答,这种感觉就是用户基数太小了,行业圈子小,用的人比较少,就算有大佬,可能也不怎么在网上活跃。
至于公司里的三坐标测量员,接触后只感觉他们对于计算机不熟悉,对编程不熟悉,只是因为常年使用,熟悉在线连机测量,知道一般怎么测,怎么建坐标系,怎么校验测针,简单的增删修改测量项,就没有更深入多少了。

2024.12.12
最开始是没有分篇章的,只是写到现在字符数有三万多了,博客这里的编辑器都有点承受不了了,编辑状态打字都能明显感觉到延迟,一直在卡顿。我就把文章拆分了,不然编辑起来都很难受。

创建脱机程序

运行软件

右键以管理员身份运行 PC-DMIS 脱机模式(PC-DMIS 使用的某些文件放置在普通用户无法访问的目录,所以建议直接用管理员身份运行,不然后续可能遇到意外的错误)
file

如果不想每次都右键运行,可以在快捷方式右键-属性-兼容性里勾选以管理员身份运行此程序,后续直接双击运行就是管理员身份
file

我在多个系统上安装使用过,有些在运行后会在左上角显示一个方框,要点确定才会打开 PC-DMIS 界面,有些运行后直接就打开界面了。
file

新建程序

点新建程序
file

给程序设置一个名字;国内一般使用公制单位,选毫米;没连三坐标测量设备,接口默认就是脱机。
file

温度补偿暂时不用管
file

配置测头

file

添加测量机

插入-硬件定义-测量机
file

file

有需要也可以添加夹具(插入-硬件定义-快速夹具),可以导入自己的夹具模型,这里只是学习编程,就不用夹具了。只是待测量模型可能就是悬空的。
file

导入模型

文件-导入
file

根据自己的模型格式选择,这里就用 PC-DMIS 提供的示例模型,选 IGES
HexMI_DemoBlock_Large.IGS
file

点处理,再点确定
file

file

校验测针(待研究)

赋值

插入-赋值
file

赋给后是变量名,赋自后是要赋值的内容
file

操作数类型

操作数类型有 7 种:整数、实数、字符串、点、特征指针、数组或函数,下面的 V1 到 V7 分别对应。
①整数如其名;②实数则类似一般编程语言中的浮点数,即小数;③字符串也如其名;④点也如其名,就是点坐标;⑤特征指针可以用来指向一个特征,比如这里测了一个平面,用 V5 变量指向这个平面,和 C/C++ 的指针类似;⑥数组和一般编程语言里的类似概念;⑦函数也和一般编程语言里概念相似。
file

变量 V5 是指向平面1这个特征的,可以通过 V5 来获取平面1的 X 坐标,也可以直接从平面 1 获取这个特征包含的信息
file

这里使用函数 V7,传入 10 和 2,会分别给 X 和 Y,即计算 2 * 10 + 2,得到 22
file

数组动态特性

PC-DMIS 中的数组可以动态扩容,访问越界也不会报错。
我创建的 V1 数组只有两个元素,通过 LEN 也获取到了大小,但是我尝试访问索引 1000 也没出错,结果为 0。可以看作是无限大小的数组了,没有赋值的索引位置值默认为 0。

            赋值/V1=ARRAY(0, 0)
            注释/操作者,否,全屏=否,自动继续=否,
            "数组V1的大小="+LEN(V1)+",数组V1[1000]="+V1[1000]

file

如果要追加元素,继续往后续索引位置赋值即可。
我创建的时候只有两个元素,然后直接在索引 100 的位置赋值后,LEN 查看数组大小就变成了 100,查看索引 100 的位置确实成功赋值了,查看索引 99 的位置得到值为 0,因为这个位置没有赋值,默认值就是 0。

            赋值/V1=ARRAY(0, 0)
            赋值/V1[100]=99
            注释/操作者,否,全屏=否,自动继续=否,
            "数组V1的大小="+LEN(V1)+",数组V1[100]="+V1[100]+",数组V1[99]="+V1[99]

file

注释

插入-报告命令-注释
file

file

这里的“注释”和一般编程语言里的注释不一样,这里的注释更像是消息框、确认对话框等集合。注释类型:

  • 操作者:消息框,在测量程序执行到这个地方会弹出一个消息框;
  • 报告:注释内容会显示到测量报告中;
  • 输入:输入框,测量程序执行到这个地方,会弹出输入框,可以向测量程序输入内容;
  • 文档:这个和一般编程语言里的注释差不多,就是用来给程序添加说明的,增强程序可读性;
  • 是/否:确认框,会弹出窗口,可以选择是否,程序内可以获取结果;
  • 读数:这里的注释内容可以显示在测头读数窗口中。
    file

显示变量值

字符串内容用英文引号(半角引号),字段之间拼接使用加号。数组使用中括号下标访问元素,下标从1开始,一般编程语言都是 0 下标开始,我接触过的似乎只有 MATLAB 也是从 1 开始的下标。数字要进行字符串拼接,需要先转字符串,不然会直接进行加法运算。

            "V1的值为"+V1
            V2[1]+V2[2]+V2[3]
            STR(V2[1])+STR(V2[2])+STR(V2[3])
            V3[1]+V3[2]+V3[3]+V3[4]+V3[5]+V3[6]

file

只是我发现一个问题,注释内容只有在命令编辑窗口中写入的时候可以正常引用变量值,但如果是在注释窗口中(下图),写入的,执行的时候无法引用变量值,不知道是不是有什么 bug
file

file

输入框

通过注释输入的内容可以通过 .INPUT 引用

C1         =注释/输入,否,全屏=否,
            "请输入内容:"
            注释/操作者,否,全屏=否,自动继续=否,
            "用户输入的内容为:" + C1.INPUT

file

file

是否框

C1         =注释/是否,否,全屏=否,自动继续=否,
            "请确认状态,是或否?"
            注释/操作者,否,全屏=否,自动继续=否,
            "状态为:" + C1.INPUT

file

file

流程控制命令

插入-流程控制命令
file

基础

运算符

符号 含义
+ 加号
减号
* 乘号
/ 除号
^
% 余数
! 逻辑非
== 判断相等
<> 判断不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
AND 逻辑与
OR 逻辑或
( ) 优先计算括号内

函数

数学函数

函数 含义
ABS 绝对值
ROUND 取整
SQRT 平方根
ACOS 反余弦
ASIN 反正弦
ATAN 反正切
COS 余弦
SIN 正弦
TAN 正切
DEG2RAD 角度转弧度
RAD2DEG 弧度转角度

数组函数

函数 含义
EQUAL 判断两个数组是否相等
LEN 返回数组元素个数
MAX 返回数组中最大元素
MIN 返回数组中最小元素
HIT[] 触测点
SORTUP 对数组升序排序
SORTDOWN 对数组降序排序
MAXINDEX 返回数组最大值索引
MININDEX 返回数组最小值索引
MAXINDICES 返回数组从大大小排序的索引值
MININDICES 返回数组从小到大排序的索引值

字符串函数

函数 含义
SYSTEMDATE dd 日期几号;ddd 星期几;M或MM或MMM或MMMM 月;y或yy或yyy或yyyy 年
SYSTEMTIME h或hh 12小时制;H或HH 24小时制;m或mm 分钟;s或ss秒;t 时间标记A/P;tt时间标记AM/PM
LOWERCASE 创建小写字符串
UPPErCASE 创建大小写字符串

获取程序信息 GEtPRogrAMINFO

……

条件语句

条件判断这里和一般编程语言的使用逻辑是一样的

IF …

IF 可以独立使用,只有 IF 后的条件成立,后续的命令才执行。
下面的例子中如果输入的值大于 0,就会显示“输入值大于0”

C1         =注释/输入,否,全屏=否,
            请输入 一个数字
            赋值/INPUT_VALUE=DOUBLE(C1.INPUT)
            IF/INPUT_VALUE > 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值大于0
            END_IF/

IF … ELSE …

ELSE 可以在 IF 后使用,在 IF 条件不满足的时候就执行 ELSE 后的语句。
下面的例子,在上面的基础上修改了,在输入非 0 值显示非正数

C1         =注释/输入,否,全屏=否,
            请输入 一个数字
            赋值/INPUT_VALUE=DOUBLE(C1.INPUT)
            IF/INPUT_VALUE > 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值大于0
            END_IF/
            ELSE/
              注释/操作者,否,全屏=否,自动继续=否,
              输入值非正数
            END_ELSE/

IF … ELSE_IF … (ELSE_IF …)

ELSE_IF 可以在 IF 后使用,在 IF 条件不满足时,再判断是否满足 ELSE_IF 条件,ELSE_IF 可以有多个,不满足条件就继续往后
下面例子判断输入值时正数或为0

C1         =注释/输入,否,全屏=否,
            请输入 一个数字
            赋值/INPUT_VALUE=DOUBLE(C1.INPUT)
            IF/INPUT_VALUE > 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值大于0
            END_IF/
            ELSE_IF/INPUT_VALUE == 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为 0
            END_ELSEIF/

下面例子判断输入值是否为正数,是否为0,是否为不小于-1的负数

C1         =注释/输入,否,全屏=否,
            请输入 一个数字
            赋值/INPUT_VALUE=DOUBLE(C1.INPUT)
            IF/INPUT_VALUE > 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值大于0
            END_IF/
            ELSE_IF/INPUT_VALUE == 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为 0
            END_ELSEIF/
            ELSE_IF/INPUT_VALUE < 0 AND INPUT_VALUE >= -1
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为负数,且不小于-1
            END_ELSEIF/

IF … ELSE_IF … ELSE …

ELSE 也可以在 ELSE_IF 后使用,当 IF 和 ELSE_IF 的条件都不满足时执行

C1         =注释/输入,否,全屏=否,
            请输入 一个数字
            赋值/INPUT_VALUE=DOUBLE(C1.INPUT)
            IF/INPUT_VALUE > 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值大于0
            END_IF/
            ELSE_IF/INPUT_VALUE == 0
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为 0
            END_ELSEIF/
            ELSE_IF/INPUT_VALUE < 0 AND INPUT_VALUE >= -1
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为负数,且不小于-1
            END_ELSEIF/
            ELSE/
              注释/操作者,否,全屏=否,自动继续=否,
              输入值为小于-1的负数
            END_ELSE/

循环

循环也和一般编程语言的使用逻辑一样

WHILE

WHILE 会先判断条件是否满足,如果满足就执行,直到不满足才停止
下面的例子,创建两个元素个数相同的数组V1、V2,然后循环遍历两个数组,依次两两相加,最后显示结果

            赋值/V1=ARRAY(1,2,3,4,5,6)
            赋值/V2=ARRAY(23,24,45,45,67,98)
            赋值/S=ARRAY(0)
            赋值/COUNT=1
            WHILE/COUNT <= LEN(V1)
              赋值/S[COUNT]=V1[COUNT]+V2[COUNT]
              赋值/COUNT=COUNT + 1
            END_WHILE/
            注释/操作者,否,全屏=否,自动继续=否,
            S

file

DO … UNTIL

DO … UNTIL 会先执行,再判断条件,直到条件满足就停止

            赋值/V1=ARRAY(1,2,3,4,5,6)
            赋值/V2=ARRAY(23,24,45,45,67,98)
            赋值/S=ARRAY(0)
            赋值/COUNT=0
            DO/
              赋值/COUNT=COUNT+1
              赋值/S[COUNT]=V1[COUNT]+V2[COUNT]
            UNTIL/COUNT >= LEN(V1)
            注释/操作者,否,全屏=否,自动继续=否,
            S

多路分支语句 SELECT CASE

这个和 C 系语言里的 switch 差不多功能,功能上用条件语句也能实现。
下面例子匹配输入,输入中文数字一、二、三中的一个,注释会弹出显示

C1         =注释/输入,否,全屏=否,
            请输入中文数字一到三
            SELECT/C1.INPUT
              CASE/"一"
                注释/操作者,否,全屏=否,自动继续=否,
                输入了 1
              END_CASE/
              CASE/"二"
                注释/操作者,否,全屏=否,自动继续=否,
                输入了 2
              END_CASE/
              CASE/"三"
                注释/操作者,否,全屏=否,自动继续=否,
                输入了 3
              END_CASE/
              DEFAULT_CASE/
                注释/操作者,否,全屏=否,自动继续=否,
                输入了其它
              END_DEFAULTCASE/
            END_SELECT/

file
file

GOTO 跳转

这个和 C 系的 goto 跳转功能差不多,PC-DMIS 里没有 continue 和 break,要在循环里跳过和结束就没有直接的实现方式,可以用 GOTO 实现。

下面的例子,用一个数组保存值,如果循环到偶数就跳过不记录

            赋值/RESULT=ARRAY(0)
            赋值/COUNT=0
            WHILE/COUNT < 9
              IF/COUNT % 2 == 0
                转到/CONTINUE
              END_IF/
              赋值/RESULT[COUNT]="数字"+COUNT
CONTINUE     =标号/
              赋值/COUNT=COUNT+1
            END_WHILE/
            注释/操作者,否,全屏=否,自动继续=否,
            RESULT

file

脱机编程

在已经配置测针和导入模型之后,切换到程序模式
file

file

如果没看到按钮,在空白处右键,勾选图形模式就有了(其它菜单可以按需勾选,后面可能也要用)
file

采集特征的操作

采集特征:按住Shift 不放,用鼠标点选平面/孔等,再点✔确认特征
file

采集群孔:点选孔所在平面,再按住Shift选择孔会全选相同大小的孔
file

file

采集点:按住Shift+Ctrl不放,鼠标点选
file

采集同一空间平面上的不连续面:按住Shift不放,点住一个平面不放,拖动到同一空间平面上的其它面
file

菜单勾选了 QuickMeasure 的话,还可以使用自动特征,这个是指定特征类型,再去采点。前面快捷键操作的方式是直接去采点,由PC-DMIS识别特征是什么类型,但实际操作中一些复杂的形状可能识别错误,就可以先指定特征类型再去采集。
file

建立工件坐标系

三维坐标系有 6 个自由度,
三轴平移:TX、TY、TZ(决定原点位置)
三轴旋转:RX、RY、RZ(决定坐标轴方向)
建立坐标系就是把这 6 个自由度都固定,这样坐标系在工件上的位置就是确定的。

示例 面-面-点 321 建系

采集上平面为平面1,采集正对的平面为平面2,采集左侧上一个点为点1。
file

新建坐标系
插入-坐标系-新建
file

确定RX、RY(X轴旋转、Y轴旋转)【确定Z轴方向】:选平面1,选Z负(正负可以自己决定,只是正反方向而已,后同),点找正
确定TZ(Z轴偏移):选平面1,选Z,点原点
确定RZ(Z轴旋转)【确定X轴和Y轴方向】:选平面2,围绕Z正旋转到Y负,点旋转
确定TY(Y轴偏移):选平面2,选Y,点原点
确定TX(X轴偏移)【确定原点位置】:选点1,选X,点原点
321 这个名字就来源于,第1个特征确定2个轴旋转和1个轴偏移,即为 3;第2个特征确定1个轴旋转和1个轴偏移,即为 2,第3个特征确定1个轴偏移。
原点和坐标轴方向确定后,图示的坐标系就不会浮动了(可以参考这个动画效果,确定一个自由度它就少一个浮动方向)
file

示例 面-圆柱-圆柱 建系

采集上平面为平面1,采集中心大孔为柱体1,采集一个小孔为柱体2
file

确定RX、RY【确定Z轴方向】:选平面1,选Z正,点找正
确定TZ:选平面1,选Z,点原点
确定RZ【确定X轴和Y轴方向】:选柱体1和柱体2,围绕Z正旋转到Y正,点旋转
确定TX、TY【确定原点】:选柱体1,选X和Y,点原点
file

循环控制

采集圆周阵列特征

这里有一圈小孔,采用循环采集(简化程序)
在中心大孔位置建立坐标系
file

插入-流程控制命令-Looping
file

这一圈小孔有8个,起始1,终止8,计划从右侧小孔开始逆时针采集,则跳过第3个(建坐标系的时候已经采集了,如果要跳过多个则用英文逗号间隔)。建立的坐标系在这8个孔的中心,那么偏置只需要角度,每次偏置360°➗8个=45°,X、Y、Z方向不需要偏置,然后设置变量标识,这个标识是循环执行号数的变量,在循环中访问这个值的话,就可以知道当前是在循环第几个特征。如果终止号是8,执行完这个标识的值就是9,如果终止号是5,执行完就是6。可以用于获取均布特征数量。
file

接着采集右侧孔,这个孔就作为第一个孔,然后插入-流程控制命令-End loop结束循环,循环命令会以采集的这个孔开始按照设置开始偏置采集其它的。

ARRAY_HOLES=循环/开始,标识=是,编号=8,开始=1,跳过=3,,
              偏置:X 轴=0,Y 轴=0,Z 轴=0,角度=45
柱体3          =特征/触测/圆柱/默认,直角坐标,内,最小二乘方
              理论值/<41,0,0>,<0,0,1>,16.4,20
              实际值/<41,0,0>,<0,0,1>,16.4,20
              目标值/<41,0,0>,<0,0,1>
              起始角=0,终止角=360
              角矢量=<1,0,0>
              方向=逆时针
              显示特征参数=否
              显示相关参数=是
                测点数=5,层数=3,深度=2,终止补偿=2,螺距=0
                采样方法=样例点
                样例点=3,间隙=0
                避让移动=两者,距离=10
                查找孔=无效,出错=否,读位置=否
              显示触测=否
            循环/终止

遍历获取群孔的X坐标

            赋值/CYLINDER_DIAMETER=ARRAY(0)
            赋值/COUNT=1
            WHILE/COUNT < ARRAY_HOLES
              赋值/CYLINDER_DIAMETER[COUNT]=柱体3[COUNT].X
              赋值/COUNT=COUNT+1
            END_WHILE/
            注释/操作者,否,全屏=否,自动继续=否,
            CYLINDER_DIAMETER

第3个孔没有采集,发现它的值和第2个孔是一样的,这个需要注意
file

采集线性阵列特征

我这里自己画了一个模型,两排孔,两排之间间隔50,每排4个孔,孔孔间距25。
file
单个循环控制可以线性均布,如果是矩形阵列,那就可以再嵌套一层循环。一层循环控制行,一层循环控制列。
下面例子中 V1 循环控制换行,1 开始 2 结束,循环一次 y 偏移 -50
V2 循环控制换列,1 开始 4 结束,循环一次 x 偏移 25
最终的测量结果都保存在柱体1这个特征中,通过中括号访问[内层循环索引,外层循环索引],注意这里是反着的,然后我创建了一个二维数组(数组里面放数组),用循环遍历,将行列进行互换后存储

V1         =循环/开始,标识=是,编号=2,开始=1,跳过=,
              偏置:X 轴=0,Y 轴=-50,Z 轴=0,角度=0
V2           =循环/开始,标识=是,编号=4,开始=1,跳过=,
                偏置:X 轴=25,Y 轴=0,Z 轴=0,角度=0
柱体1            =特征/触测/圆柱/默认,直角坐标,内,最小二乘方
                理论值/<12.5,75,100>,<0,0,1>,20,50
                实际值/<12.5,75,100>,<0,0,1>,20,50
                目标值/<12.5,75,100>,<0,0,1>
                起始角=0,终止角=360
                角矢量=<1,0,0>
                方向=逆时针
                显示特征参数=否
                显示相关参数=是
                  测点数=5,层数=3,深度=2,终止补偿=2,螺距=0
                  采样方法=样例点
                  样例点=3,间隙=0
                  避让移动=两者,距离=10
                  查找孔=无效,出错=否,读位置=否
                显示触测=否
              循环/终止
            循环/终止
            赋值/RESULT=ARRAY(ARRAY(0))
            赋值/ROW=1
            赋值/COL=1
            WHILE/ROW < V1
              WHILE/COL < V2
                赋值/RESULT[ROW,COL]=柱体1[COL,ROW].X
                赋值/COL=COL+1
              END_WHILE/
              赋值/ROW=ROW+1
              赋值/COL=1
            END_WHILE/
            注释/操作者,否,全屏=否,自动继续=否,
            RESULT

file

子程序

插入子程序和调用子程序(插入-流程控制命令)
file

子程序的概念比较像一般编程语言中自定义函数

简单使用

            子程序/FUNCTION1,
                 = 
            注释/操作者,否,全屏=否,自动继续=否,
            这是子程序1
            终止子程序/
            子程序/FUNCTION2,
                 = 
            注释/操作者,否,全屏=否,自动继续=否,
            这是子程序2
            终止子程序/
CS1        =调用子程序/FUNCTION1,:,
CS2        =调用子程序/FUNCTION2,:,

file
file

子程序传参

创建子程序 FUNCTION1,然后有两个参数 VAL1 和 VAL2,分别提供参数默认值为 VAL1_DEFAULT 和 VAL2_DEFAULT
主程序调用子程序,传入一个参数 "IYATT-yx",可以看到注释显示的结果,传进去的参数被显示了,但没有提供第2个参数,就显示的参数默认值

子程序/FUNCTION1,
                VAL1 = "VAL1_DEFAULT" : 值1,
                VAL2 = "VAL2_DEFAULT" : 值2,
                 = 
            注释/操作者,否,全屏=否,自动继续=否,
            "值1="+VAL1
            "值2="+VAL2
            终止子程序/
CS1        =调用子程序/FUNCTION1,:"IYATT-yx",,

file

托盘测量(研究中)

检测报告模板

标签模板

文件路径

检测报告中每个模块都标签模板插值的,打开检测报告,将鼠标停留在模块上就会显示
比如鼠标放在标签头上的时候,显示的是 FIEL_HEADER.LBL
file

鼠标放在位置度部分的时候,显示的 Line2_pos.lbl
file

放在这个尺寸位置的时候显示的 Line1.lbl
file

标签模板的路径查看:
编辑-参数设置-设置搜索路径
file

只要没改过测头路径,默认的标签模板也在这个路径下面的 Reporting 里面
file

file

修改文件

编辑标签模板
文件-报告-编辑-标签模板
file

示例 修改文件头模板

建议备份副本进行修改,选中 FILE_HEADER.LBL 按 Ctrl+C 复制,再按 Ctrl+V 粘粘得到副本,选择副本进行编辑
file

在预览界面双击进入编辑状态
file

可以看到这其实就是一个表格,每个单元格按照指定格式取值,
file

在某个单元格上右键可以进入更详细的编辑状态
file

这里我把序列号的值改为取变量 V1 的值
用下面表达式获取变量值

=VARIABLE("变量名")

file

Ctrl+S保存,然后关闭标号模板编辑器窗口
在报告上右键将文件头模板修改为我修改的文件
file

file

这时候鼠标停留在文件头位置,提示就变成了我设置的文件
(PC-DMIS 可能有什么 bug,修改后的文件名需要和修改前不同,如果不改文件名复制到其它目录,在修改模板更换文件的时候不会生效,必须文件名不同才能修改成功)
file

然后在程序中插入一个 V1 变量,注意插入的位置要在加载测头和温度补偿的前面,报告里的文件头大概就是在温度补偿这个位置开始渲染的,在之后才赋值,文件头已经渲染好了,就只能读取到上一次执行程序时变量的值
file

然后执行程序,可以看到序列号改成我这里变量的值了
file

修改日期、时间案例

下面给一个可以修改报告日期、时间的例子
修改文件头标签模板,把日期位置改为 =VARIABLE("DATE"),时间位置改为 =VARIABLE("TIME"),即日期来自 DATA 变量,时间来自 TIME 变量。
file

编写程序
有需要可以使用注释输入,这样执行的时候填进去就行

            赋值/YEAR=2010
            赋值/MONTH="五月"
            赋值/DAY=15
            赋值/HOUR=18
            赋值/MINUTE=23
            赋值/DATE=MONTH+" "+DAY+", "+YEAR
            赋值/TIME=HOUR+":"+MINUTE

file

示例 修改位置度模板

显示值

位置度模板用的 LINE2_POS.lbl,拷贝副本进行编辑,下面是列数据原值

=TOL(LINE2_FEATNAME:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_NOMINAL:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_PLUSTOL:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_MINUSTOL:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_MEAS:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_DEV:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_OUTTOL:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_BONUS:N,LINE2_OUTTOL:N,0.0,0.0)
=TOL(LINE2_DEVANG,LINE2_OUTTOL:N,0.0,0.0)

TOL 函数是用来着色的,第一个参数是要着色的对象,这里就是要显示的值(特征名、标称值、上差、下差、测量值、偏差值、超差值、补偿值、偏差角度);
第二个参数都统一放的超差值,只要这个值大于 0,就会进行特殊着色,默认是红色。
后面两个参数默认值是 0.0,就不知道是什么了,用不上就暂时先不管。
然后可以看到存在“字段:N”这种写法,这就是用来遍历的,详细地可以参考后面篇章的 Python 二次开发部分。有些情况下,同种形位公差评价了多个特征,就会一起显示在下面,N 就是遍历第几个。
现在需要替换成呈现自定义的数据,我用一个检测程序中的位置度评价测试,评价了 10 个圆。
file

我只需要自定义测量值、偏差值、超差值,就创建了 V1、V2、V3 三个变量(数组),分别用于插入模板

            赋值/V1=ARRAY(1.1, 2.2, 3.3, 0.15, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10)
            赋值/V2=ARRAY(1.1, 2.2, 3.3, 0.15, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10)
            赋值/V3=ARRAY(0.9, 1.9, 2.9, 0, 4.9, 5.9, 6.9, 7.9, 8.9, 9.9)

修改副本模板文件,分别替换为

=TOL(LINE2_FEATNAME:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(LINE2_NOMINAL:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(LINE2_PLUSTOL:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(LINE2_MINUSTOL:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(VARIABLE("V1["+N+"]",ID:N),VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(VARIABLE("V2["+N+"]",ID:N),VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(VARIABLE("V3["+N+"]",ID:N),VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(LINE2_BONUS:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)
=TOL(LINE2_DEVANG:N,VARIABLE("V3["+N+"]",ID:N),0.0,0.0)

TOL 第二个参数用于控制着色,报告中如果某一个特征测量超差,整行都会变红,所以全部都要统一换成自定义的超差值,格式按照 VARIABLE("变量名["+N+"]",ID:N) 写,这样就能遍历自定义数组
然后测量值、偏差值、超差值所在列的 TOL 第一个参数要替换成自定义数据,以显示自己的数据。
然后在报告上更换模板为修改后的副本,可以看到效果。
file

ActiveX 控件图形(研究中)

报告中这类图形就是 ActiveX 实现的
file
file

PC-DMIS 2019 R2 脱机编程和 Python 二次开发 第1篇(研究记录中)
Scroll to top