0
点赞
收藏
分享

微信扫一扫

RationalDMIS 2020宏程序

宏是一组DMIS命令,能够完成特定任务,可以被程序反复使用。使用宏可以省去编写重复代码的麻烦。

宏的应用分两步:

 定义宏语句,称之为声明。

 使用宏,称之为调用。


宏声明

在调用宏之前,必须使用定义语句声明宏。声明宏时,DMIS语句将同步执行宏的定义参数列表。

参数列表是宏用来将数据传递到宏中的一个或多个变量的组合,也可不用参数列表。

宏语句格式

M(名称)=MACRO/参数列表

名称:用来定义宏的名字

参数列表:一组变量,用于将数据输入宏程序

宏例子

  下面的宏的功能是弹出输入框,计算输入数值的平方后再弹出计算结果。

M(SquareCAL)=MACRO

DECL/DOUBLE,AA

DECL/CHAR,255,BB

AA= PROMPT/'请输入数值:', 1000.000000, -10000.000000

AA=ASSIGN/AA*AA

BB=ASSIGN/CONCAT('平方和为:',STR(AA))

TEXT/OPER,BB

ENDMAC

  下面宏的功能是计算三个数的平均值并弹出计算结果

M(AvrCal)=MACRO/A1,B1,C1

DECL/DOUBLE,AVR

AVR=ASSIGN/(A1+B1+C1)/3

DECL/CHAR,55,AVRT

AVRT=ASSIGN/CONCAT('平均值为:',STR(AVR))

TEXT/OPER,AVRT

ENDMAC

宏可以在主程序中,也可以在外部文件中。
如果在主程序中,宏必须位于程序开始的位置。

M(foro)=MACRO/off_x,off_y,'nome_ci'
DECL/LOCAL,DOUBLE,r_foro,z_mis
r_foro=ASSIGN/6.25
z_mis=ASSIGN/-2.5
F(@nome_ci) = FEAT/CIRCLE, INNER, CART, off_x, off_y, z_mis, 0, 0, 1, r_foro*2
MEAS/CIRCLE, F(@nome_ci), 4
GOTO/off_x, off_y, 7
PTMEAS/CART, off_x+r_foro, off_y, z_mis, -1, 0, 0
PTMEAS/CART, off_x, off_y+r_foro, z_mis, 0, -1, 0
PTMEAS/CART, off_x-r_foro, off_y, z_mis, 1, 0, 0
PTMEAS/CART, off_x, off_y-r_foro, z_mis, 0, 1, 0
GOTO/off_x, off_y, 7
ENDMES
ENDMAC
$$ instructions
$$ instructions
CALL/M(foro),12.5,12.5,(foro1)
$$ instructions
$$ instructions
在使用“EXTFIL”指令后,可以在外部文件中定义宏
EXTFIL/DMIS,'c:\cim\MACRO.dmi'
宏的外部文件必须以“.DMI”为后缀,由“DMISMD”开始,并由“ENDFIL”结束。在宏定义文件中,它的语法和DMIS程序相同。
DMISMD/'module_name'
M(macro_1)=MACRO/passedtext
TEXT/OPER,CONCAT('You passed the following text to the macro: ',passedtext)
ENDMAC
M(macro_2)=MACRO/num1,num2
DECL/DOUBLE,sumres
sumres=ASSIGN/num1+num2
TEXT/OPER,CONCAT('The sum of the 2 numbers is: ',STR(sumres))
ENDMAC
ENDFIL

Macro是DMIS中类似于定义一个函数,可以传递一些参数,我们可以这样来理解宏.
我们新做了一个函数,通过CALL来输入对应的参数,即可完成设计的功能.
例如,之前论坛上有一个写曲线投影到平面的程序,大概程序的结构为
    定义一个宏,假设为M(SSJ)
    CALL/M(SSJ),‘FA(GCV1)’,‘FA(PLN1)’
    那么在定义这个宏语句的时候,只需要两个参数:曲线的标签名和投影平面的标签名.
    其它的计算和处理都在前面所定义的宏中完成.
    宏的好处不言而喻,他使得程序的通用性更强,更模块化,更利于查错.
    宏定义的语法为:M(LABEL) = Macro/varname,‘lable’
                            ENDMAC
    以一个简单例子说明
    输出圆CIR1的直径\X坐标\Y坐标\Z坐标
    通常我们的语句为
    DECL/COMMON,DOUBLE,DATAC[4]
    DATAC[1] = OBTAIN/FA(CIR1),4
    DATAC[2] = OBTAIN/FA(CIR1),5
    DATAC[3] = OBTAIN/FA(CIR1),6
    DATAC[4] = OBTAIN/FA(CIR1),10
    WRITE/DID(DEFAULTSCREEN),DATAC[1]
    WRITE/DID(DEFAULTSCREEN),DATAC[2]
    WRITE/DID(DEFAULTSCREEN),DATAC[3]
    WRITE/DID(DEFAULTSCREEN),DATAC[4]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是如果这个用宏定义来做,语句是这样
  M(demo) = MACRO/‘CIR1’
    DECL/COMMON,DOUBLE,DATAC[4]
    DATAC[1] = OBTAIN/FA(CIR1),4
    DATAC[2] = OBTAIN/FA(CIR1),5
    DATAC[3] = OBTAIN/FA(CIR1),6
    DATAC[4] = OBTAIN/FA(CIR1),10
    WRITE/DID(DEFAULTSCREEN),DATAC[1]
    WRITE/DID(DEFAULTSCREEN),DATAC[2]
    WRITE/DID(DEFAULTSCREEN),DATAC[3]
    WRITE/DID(DEFAULTSCREEN),DATAC[4]
ENDMAC
CALL/M(demo),(CIR1)
表面上来看,结果没有变,但是代码好象增多了.
如果同样我需要输出CIR2的这些值,我不需要再修改源程序,只需要将CALL语句中的CIR1替换为CIR2即可.
但是如果是第一种代码,我们需要把所有的CIR1替换为CIR2,不仅不方便,而且容易出错.
我再需要输出其它圆的这几项实际值,只需要调用这个宏M(demo)即可以,不用重复再去写代码,保证程序的模块化.
PS: 宏定义的参数有两种,标签名和变量.
在用CALL语句做调用时,同样也只有两种参数.
定义的时候标签名为单引号,变量没有什么限制,例如 M(demo) = macro/‘CIR1’,tempchar
调用宏的时候,标签名为括号,变量无限制,例如CALL/M(demo),(CIR1),tempstring
宏在测量程序上的很有意义,很多写好的程序,可以用宏的方式写出来,方便以后做调用,节省不必要的代码工作.
RationalDMIS 2020宏程序_宏定义


举报

相关推荐

0 条评论