AVEVA PDMS 二次开发之PML语言基础 21/10/21 01.0.02

系列文章目录


AVEVA PDMS 之建库
AVEVA PDMS 之项目管理
AVEVA PDMS 之平面/ISO出图及自定义
AVEVA PDMS 二次开发之窗体结构
AVEVA PDMS 二次开发之PML语言基础
AVEVA PDMS 二次开发之PML语言编程
AVEVA PDMS 二次开发之PML插件
AVEVA PDMS 二次开发之Advace PML.NET编程



前言

很感谢你能搜到这篇文章,并愿意认真的阅读。本文为原创文章,创作不易,请在引用时,注明出处。这篇文章主要记录PML语言的基础内容,希望读者看完后,能掌握如下:

  • 实现对PML语言的整体了解
  • 基本编程概念的理解和PML应用
  • 了解如何通过PML控制设计模型
  • 了解如何建立PML窗口

正文

使用编辑器为UltraEdit,np++
使用软件版本为PDMS 12.

一、PML介绍

简介

PML 是 Programamable Macro Language 的缩写,前后共有两个版本。
Macro 称作宏,是包含PDMS命令序列的ASCII文件,可以理解为一系列预定义规则以文本方式展现的集合。
PML1 包含循环语句,条件语句、字符串处理、跳转语句(GoLabel)等。
PML2 是基于PML1开发的面向对象语言,扩展了很多现代面向对象语言的特征,对PML1完全兼容

PDMS 加载

  1. PML会在一个对象或者窗体被第一次使用时自动加载:
!person = object PRIMEMINISTER()
SHOW !!MYINPUTFORM
  1. 已被加载的对象可重新定义命令:
pml reload form !!myinputform
pml erload object PRIMEMINISTER()
  1. 在进入PDMS后识别新增的重新文件命令:
pml rehash all
  1. PDMS 非常有用的命令
--PML1
--COLLET命令/EVALUATE命令
--COLLET命令提取一个PDMS系列下的元素赋值给变量
--EVALUATE命令提取一个PDMS系列下元素的属性赋值给变量
var !equipment collect all EQUI for ZONE
q var !equipment
var !equipmentname evaluate name for all from !equipment
q var !equipmentname
var !pumps evaluate name for all with matchwild(namn,|p*|) from !equipment
q var !pumps

var !pipecomponents collect all with owner eq /200-A-5-C1 for SITE
q var !pipecomponents
var !elbows evaluate FLNN for all ELBO from !pipecomponents
q var !elbows

var !boxes collect all BOX for ce 
q var !boxes
var !volume eval(xlen * ylen * zlen) for all ELBO from !box
q var !volume

--PML2(使用COLLECTION OBJECT执行)
--COLLET命令/EVALUATE命令
--all collected items are now DBREF objects,not STRING objects - as with the COLLECT command
!equicoll = object COLLECTION()
!equicoll.type('EQUI')
!equicoll.scope(!!ce)
!expr = object EXPRESSION(|NAME OF OWNER EQ '/EQUIP'|)
!!equicoll.filter(!expr)
!results = !equicoll.results()
q var !results
--the collection object returns an array of results
--the array object has an .evaluate() method:
!block = object block (|!results[!evalindex].flnn|)
!resultnames = !results.evaluate(!block)
q var !resultnames
--the .evaluate() method requires a block object as the argument,this is defined with a string expression.

二、基础笔记

1.符号解释

--这是一句注释,必须单独占用一行

$*这是一句注释,可跟在代码后面

$(
这是块注释(也称作段落注释)
$)

$P 为打印,具体在PDMS命令窗口输出

2.Macros

在PDMS中通过命令行$m /FILENAME 来执行宏文件:

--参数化宏(可以有9个由空格分隔的参数)
--$<之间的任何字符都是单个参数$>
$M/NEWBOX 100 200 300 $*后面三个数字是三个参数($1 $2 $3),传入宏程序
NEW EQUIP /FRED
NEW BOX
XLEN $1 YLEN $2 ZLEN $3
NEW CYL DIA $4 HEI $5
CONN P1 TO P2 PF PREV

--Synonyms 是较长命令语句的缩写。
-- 可参数化;
--等价于宏的调用方法;
--可递归执行;
--清除单个Synonyms,$SXXX = ;清除所有Synonyms,$sk;
--Synonyms的开关:$S- AND $S+--表示方式如下:
$SXXX = NEW ELBO SELECT WITH STYP LR ORI P1 IS N
--参数化
$SXXX = NEW BOX XLEN $S1 YLEN $S2 ZLEN $S3
--调用
XXX 100 200 300
--递归执行举例:修改一定范围内的元件的第6个参数
--单个修改命令是:PARAM N6 462 NEXT
$SXXX = PARAM N6 462 $/NEXT $/XXX	$/等同于回车键

编写如下设备的宏示例:
在这里插入图片描述

  • 用(Position E 0mm N 0mm U 0mm)可定位放置的位置
  • 最后保存成一个xxx.txt文件,直接拖进控制台或者命令调用
  • 所有运算符前后都必须加空格,包括等号,否则报错
--未参数化宏:
new equi /aword_box
new box xlen 1000 ylen1000 zlen1000
new cyli dia 400 hei 600
conn p1 to p3 of pre
new snout hei 300 dtop 600 dbot 400
conn p2 to p2 of pre
new dish dia 600 hei 300
conn p0 to p1 of pre
Orientation Y is N and Z is U	$*此参数放最后,否则定位中心会偏移

--参数化:
new equi /$1
new box xlen $2 ylen $2 zlen $2
new cyli dia $3 hei $4
conn p1 to p3 of pre
new snout hei $5 dtop $6 dbot $3
conn p2 to p2 of pre
new dish dia $6 hei $7
conn p0 to p1 of pre
Orientation Y is N and Z is U

--调用宏:
$M E:\\11.TXT S5 1000 400 600 300 600 300

3.PDMS命令举例

代码如下(示例):

--查询属性
Q ATT

--加载当前模型进入三维视图
ADD CE

--标记符合要求的元素
MARK WITH (NAME OF STRING) ALL VALV WHERE CPAR[1] GT 100

PDMS语法结构
PDMS语法结构图

4.PDMS语法查询方法(参考)

  • DB Listings Utility
  • $Q syntax
  • Using standard product
  • Reference Manuals

5.PML2

5.1 PML2相对于PML1新增量
  • 新增变量 string,real,boolean,array
  • 在method中执行
  • 用Function代替Macro
  • 支持自定义对象类型
  • 新的PML搜索路径
  • 动态加载Forms,Function,Objects
  • 辅助显示功能
5.2 面向对象PML2举例
--定义实数变量3
!realvariable = 3
--查询变量数值
q var !exampleobject
--查询变量可用方法
q var !exampleobject.methods()
--查询变量成员属性
q var !exampleobject.attributes()
--删除当前变量
!exampleobject.delete()
5.3 Objects 对象
  • 5.3.1 三大类型的对象
Built-in( eg:string , real , boolean , array)
system-defined(eg:position , orientatuion)
user-defined $*允许用户建立自己的PDMS对象类型

允许用户使用的对象类型记录在随机文档手册:《Software Customisation Reference Manual》

  • PML2自带大量标准对象(每一个对象都自带了一系列的内置方法)
    1.所有变量类型

    2.BORE,DIRECTION,DBREF,FORMAT,MDB,ORIENTATION,POSITION,FILE,PROJECT,SESSION,TEAM.USER,ALERT,FORM

    3.所有窗体控件和大量的graphical aid objects

  • PML Built-in Objects

    ARRAY;BLOCK;BOOLEAN;REAL;STRING;DATETIME;FILE;FORMAT

  • PDMS Objects

    BORE;DB;DBREF;DIRECTION;MDB;ORIENTATION;POSITION;PROJECT;TEAM;USER

  • Forms and Menus Objects

    ALERT;OPTION;ALPHA;PARAGRAPH;BAR;RGROUP;BUTTON;TEXT;FORM;TESTPANE;FMSYS;TOGGLE;FRAME;VIEW;2D VIEW;3D VIEW;LIST;MENU

  • 3D Geometry Objects

    ARC;LINE;LINEARGRID;PLANE;PLANTGRID;POINTVECTOR;RADIALGRID;XYPOSITION

  • Methods available to all PML Objects
    在这里插入图片描述

  • The File Object

    1.PML1中的‘openfile’ ‘readfile’ ‘writefile’ ‘closefile’ 语法已被file object 代替,读写只需一个操作即可完成

--首先创建对象,应该能看懂哈
!input = object file('path')
!output = object file('path')
!output.open('WRITE')			$*参数包括:READ,WRITE,OVERWRITE,APPEND
--前提的文件已经被打开
!line = !input.readrecord()		$*读一行
!line = !input.writerecord()	$*写一行
!filearray = !input.readfile()	$*读整个文件
--自带打开或关闭文件
!output.writefile('WRITE',!filearray)	$*写入所有数据
!filearray = !input.readfile(10000)		$*允许写入的最大行数
2.File Object的方法,文件对象扩充了PML1中文件处理的功能,新功能包括:

文件类型检查 ->>判断是文件还是文件夹
文件打开检查 ->>判断文件是否已经打开
文件所属查询
文件列表
文件可以移动到其他文件夹
读取文件大小
……

3.自定义Objects,自定义对象可以包含**人员类型变量**或**对象**作为该对象成员,定义的对象要用一个**变量**存放该对象作为对象的实例
define object VIEWCLIPDATA
	member.pos is position
	member.xlen is real
	member.ylen is real
	member.zlen is real
	member.ori is orientation
endobject

--eg:
--define object
define object element
	member.type is string
	member.material is string
endobject
--using object
!item = object element()
!iltem.type = 'flange'
!iltem.material = 'carbon steel'

--define objects that contain methods
define object element
	member.type is string
	member.material is string
endobject
define method .fulldesc() is string
	return !this.type & '' & !this.material
endmethod
--using method
!name = !item.fulldesc()

--构造函数
--默认构造函数:名字与对象的类型相同,且没有参数的方法
--eg:
define object life
	member.answer is real
endobject
defin method .life()
	!this.answer
endmethod
fefine method.answer() is real
	return !this.answer
endmethod
define method.answer(!newanswer is real)
	!this.answer = !newanswer
endmethod
--应用
!marvin = object life()			$*method.life()自动调用
!marvin.answer(42)
!number = !marvin.answer()		$*返回值为42
!marvin.answer(40)
!number = !marvin.answer()		$*返回值为40
4.Compose命令,有时需将text排成多列,这时可以使用VAR命令的compose功能,compose总是返回一个且最少有一个元素的数组,数组元素个数取决于text允许的字符串长度和每列的宽度
--eg:
VAR !ANS COMPOSE '$!X' WIDTH 4 SPACE 1 '$!Y' $WIDTH $!BB R SPACE 1 '$!Z'
--compose得到一个数组
VAR !X COMPOSE 'HELLO HOW ARE YOU' WIDTH 5
Q VAR !X
!X[1] 'HELLO'
!X[2] 'HOW'
!X[3] 'ARE'
!X[4] 'YOU'

5.4 Variable 变量

变量类型

  • 字符串(string),简单理解就是’'单引号括起来的内容
  • 实数(real),整数类型包含在其中
  • 布尔(boolean),表逻辑,如AND,OR,NOT,TRUE,FALSE
  • 数组(array),存任意类型数据

    变量类型可以提供内部方法转换值的类型
    .real() .boolean() .string()

--变量名最长16个字符(不包含定义符!和!!),可包含字母和数字,不能用数字开头,不能用点(.)开头,大小写不敏感。
!variablename	$*局部变量
!!variablename	$*全局变量

--创建变量
!name = 'text'	$*局部string变量
!!nuber = 55	$*全局real变量
!!flag = TRUE	$*全局boolean变量

--创建局部空数组
!values = array()
!newarray[1] = |xxx| or !newarray[1] = 'xxx'  $*''|| 等效

如果一个变量声明为对象类型,那么它会成为这个对象的实例,对象所有的方法和成员都可以使用。

!newplant = object FACTORY() 	$*声明变量!newplant 为对象

--变量!newplant的方法和成员
!newplant.name = 'test'
!newplant.workers = 500			$*定义变量!newplant的workers方法的值为实数500
!newplant.output = 20000

q var !newplant.workers			$*查询变量!newplant的workers方法
<REAL>500						$*根据方法返回的值为500

命名及特殊变量

  • 采用有意义的变量名字
  • ’ '单引号和 | |管道符都为字符串的分隔符
  • 数字变量可以是任意类型(暂时我还没懂)
  • AVEVA使用CD作为很多旧方法的前缀
  • 新的方法和对象注意不要与AVEVA现有的方法和对象冲突
  • 特殊变量
!!CE									$*得到当前元素的参考,是DBref类型

-- . 点操作符可以提取元素属性
!branchheadbore = !!CE.Hbore
!headposition = !!CE.Hposition
!headeasting = !headposition.East
poswrtvalve = !headposition.WRT(!Valve)			$*得到一个元素相对于另一个元素的坐标

--也可以使用PML语法赋值
dbref.attributename = PMLvariable
!!ce.poss = !pos
!dbref.name = '/PIPE-100'
!!ce.built = TRUE

--也可以使用PML对象进行赋值
!!ce.position = !newposition

-- 如果CE的属性本身是一个PML对象,无法直接进行赋值,需分两个阶段进行
!pos = !!ce.position
q var !pos
!pos.up = 1000
!!ce.position = !pos
q var !pos

!!ERROR
!!PML
!!ALERT
  • 命名变量赋值
--命名变量赋值(PML1)
VAR !FRED NAME							$*获得当前元素的名字
VAR !POS POS IN WORLD					$*获取当前元素相对世界坐标
VAR !X 'NAME'							$*变量值给定为字符串NAME
VAR !TEMP (23 * 1.8 + 32)				$*计算结果赋值给变量
VAR !LIST COLL ELBO FOR CE 				$*得到一个字符串类型的Reference数组

-命名变量赋值(PML2)
!NAME = !!CE.NAME						$*获得当前元素的名字
!POS = !!CE.POS.WRT(/*)				*/	$*获取当前元素相对世界坐标
!X = 'NAME'								$*变量值给定为字符串NAME

--PDMS展开变量用 $ (PML1)
--创建过程
VAR !XLEN (500)
VAR !YLEN (500)
VAR !ZLEN (500)
--展开过程
NEW BOX XLEN $!XLEN YLEN $!YLEN ZLEN $!ZLEN
  • PML表达式
--PML计算式表达式写法
var !z ('$!x' + '$!y')			$*PML1写法,!z是string
!z = !x + !y					$*PML2写法,!z是real且!x and !y 必须是real,变量仍然可以在PML1中通过调用符 $ 使用,!z是string

--表达式运算符
算术运算:+-*/
合并连接符:&					$*变量自动转换成string,与 + 号区别主要是拼合作用,不想举例希望你明白。
比较运算:EQ(等于) NE(不等于) LT(小于) GT(大于) GE (大于等于)  LE(小于等于)
布尔运算:NOT AND OR TRUE FALSE
数学运算:SIN() COS() TAN() SQR() POW() NEGATE() ASIN() ACOS() ATAN() LOG() ALOG() ABS() INT() NINT()

--表达式运算符区别:
--PML1与PML2的区别在于,PML1以参数的形式应用,PML2使其以method的方式运用
--PML1
!S = 30 * SIN(45)
!T = POW(20,2)
--PML2
!A = 45
!S = !A.SIN()
!B = 20
!T = !B.POWER(2)

--PML2表达式可嵌套
--可调用函数和方法
--可从窗体控件gadget,对象,方法,成员取值

5.5 If 条件语句
-- 结构,语句返回结果为TRUE 或者 FALSE 的Boolean(布尔值)
if (condition 1) then
	[content 1]
elseif (condition 2) then
	[content 2]
else								$*表示一定有一个条件符合并可被执行
	[content 3]
endif

--表达式可以直接赋值给布尔类型的变量
!success = !value GT 0				$*表达式赋值给变量
if (!success) then					$*变量!success是布尔类型
if (!!myfunction()) then			$*函数返回值是布尔类型
!mystring = 'TRUE'
if (!mystring.boolean()) then		$*把一个值转换成布尔类型	
	
5.6 Array 数组
  • 若干值,统称元素
  • 创建一个数组元素,这个数组自动创建
  • 数组可以是多维的
--一维数组
!asst[1] = 'ppp'
!asst[2] = 'lll'

q var !asst[1]
<STRING> 'PPP'

--二维数组
!asst[1][2] = 'ppp'
!asst[1][2] = 'lll'
!asst[2][1] = 333
!asst[2][2] = 555

q var !asst[2][1]
<REAL> 333
q var !asst[1][2]
<STRING> 'lll'

  • 声明数组

    数组声明后才能使用append方法

    !myarray  = array()			$*声明
    !maaraay.append('test')		$*增加一个字符串
    
  • 数组的方法

!number = array.size()		$*返回数组元素个数
array.clear()				$*删除所有元素,五返回值
!newarray = oldarray.removefrom(5,10)	$*对旧数组5~10个元素的切片,返回新数组,结果可抛弃(当作命令使用)
5.7 Do 循环
--结构,希望你明白,不想注释了
do [variable] form [startvalue] to [endvalue] by [step]
	[content]
	break/skip if (condition)		$*break为跳出循环,skip为跳出单次循环
	if (condition) then
		break/skip
	endif
enddo

--Do 循环与Array 数组(数组遍历)
Do [variable] index/values !array	$*index是取出数组下标,values是取出值
	[content]
enddo
5.8 Golabel 跳转语句
--结构,跳转到Label所标记的行,下一行执行,所标记行与Golabel命令不分先后
LABEL /FRED		$*变量名最长16字符,不能含有 / 符
PDMS Commands 
GOLABEL /FRED if(condition) $*判断结果为TRUE则跳转,否则反之。

5.9 Erros & Error Handing 错误处理

一个命令或宏或函数执行错误,都会造成PDMS报错,一般会出现如下三个效果:

  • 弹窗,提示用户错误
  • 输出错误信息,并输出错误程序
  • 退出当前执行的宏或者函数
(46,28)ERROR-Variable FRED not defined.		$*46是模块信息,28是错误代号

--处理错误(引起错误是宏或者函数的某一行时,可使用HANDLED语句处理)
a command causes error (46,27)
handle(46,27)				$*错误代码
	handle block			$*处理办法
elsehandle(46,28)
	[content]
elsehandle any				$*除了指明的(4627)和(4628)以外的其他错误
	[content]
elsehandle none				$*当没错误时执行
	[content]
endhandle
5.10 Alert 弹窗
--三种无返回值
!!alert.error('这是错误',X,Y) 		$*自定义弹出位置,X,Y代表屏幕比例
!!alert.message('这是信息')
!!alert.warning('这是警告')

--三种有返回值
!sumvaule = !!alert.confirm('返回是或否')
!sumvaule = !!alert.question('返回是或否或取消')
!sumvalue = !!alert.input('提示输入值,返回字符串','缺省值')
5.11 Function & Mthod
  • 函数和方法提供PML的功能
  • PML函数是在一个独立文件里的PML代码段,被调用时逐句执行
  • 函数名与文件名必须一致,文件名后缀为xxx.pmlfnc
  • 与宏文件区别

    函数是动态加载的
    函数可以接受PML对象的特定参数
    函数可以接受PML对象的特定数值

  • 函数是GLOBAL全局的,方法属于对象
  • 都允许使用使用参数和返回值
  • 调用方法是call !!functionname()
  • 函数可以在表达式中使用
  • eg:
5.11.1 Function 函数
--定义带参数和有返回值的函数,为计算一个面积的全局变量,参数为长和宽都是实数类型
define function !!area(!len is real,!wid is real) is real 
	!area = !len * wid
	return !area		$* 函数返回值
endfunction

--函数在表达式中使用
!height = 20
!BOXVOLUME = !!area (15,300) * !height	$* 调用函数!!area传参,给变量!area赋值
--不带参数且没有返回值的函数
define function !!lockce()
	!!ce.lock = !!ce.lock.not()
endfunction

宏文件ladder转换成函数,需要定义参数

define function !!ladder(!n is string,!h is real)

--调用程序时,输入对应参数
!!ladder('ladder1',3000)
5.11.1.1 PML2的函数的递归调用
define function !!testfun(!last is real,!previous is real)
	!next = !last + !previous
	!!resultarray.append(!next)
	if (!!resultarray.size() lt 100) then
	
		--这里函数调用了自己
		!!testfun(!next,!last)
	endif
endfunction
5.11.2 Method 方法
  • 变量创建以后,变量的类型不可修改
  • 通过方法修改变量类型
!x = '55'
!y = (!x.real() * 2)

--method也可用在if语句中
if(!x.real() eq 55) then
!nn = !x.real()		$*创建一个有!x字符串变量转变成实数变量!nn
  • PML内置方法

    注意 . 分隔符是在变量名和方法名之间,方法名之后记得有单括号,共同组成方法

--方法名相同,参数不同,用法也就不同
!namestring = !name.split
!namestring = !name.split('/')	$*生成一个数组

sum = !OneString.length() 	$*返回一个字符串的长度,对原变量无影响
  • 方法串联
!text = 'hello world how are you'
!newtext = !text.upcase().split().sort()		$*串联
q var !newtext
<array>
	[1]<string> 'ARE'
	[2]<string>'HELLO'
	[3]<string>'HOW'
	[4]<string>'WORLD'
	[5]<string>'YOU'
	
5.12 Forms & Form Gadgets
5.12.1 Forms 窗体
  • 窗体是全局变量

Form(窗体) 和 Form Gadgets(窗体控件)可按全局变量处理

q var !!formname				$*输出窗体的所有属性、gadget、member
q var !!formname.gadgetname		$*查询form gadget的属性
q var !!formname.gadgetname.val
		
  • 窗体用来定义用户界面
  • 窗体有自己的成员和方法
  • eg:
--窗口定义
setup form !!formname [dialog dock left(r/t/b)/document float]	$*[]内为停靠位置/窗口浮动,可不需要
	title '这是我的窗体'
	lcontitle 'myform'
	!!formname.initcall = '!this.init()'	$*初始化窗体控件,或直接设定为'callbacktring'
	button.mybutton 'print name of ce' call '!this.print()'
exit

--窗口方法定义
define method.init()	$*窗体初始化,当窗体被打开时调用
	[content]
endmethod

dfine method.print()
	$p !!ce.flnn	$* $P为显示,具体在PDMS命令窗口输出
endmethod

--PDMS命令
show !!formname 		$*加载并显示
loadform !!formname		$*加载但不显示

--窗体内置方法
!!formname.show()
!!formname.hide()
if (!!formname.shown()) then	$*查询是否已经被显示
endif
5.12.2 Form Gadgets 窗体控件
5.12.2.1 定义占用面积
- >>由大小和位置决定

定义执行操作 callback
->>任何可选控件在创建时就有一个callback被创建
->>显示一个form
->>执行一个命令
->>执行一个函数或者方法

button .opt 'options' call 'show !!formname'
button .del 'delete' call 'delete equipment'
button .apply 'apply' call 'functionname'
button .applyer 'apply' call '!this.methodname'	
button .ok 'ok' ok		$*直接定义
button .cancel 'cancel' cancel		$*直接定义

--form的构造函数(窗体被加载时调用)
--用下面的方法单独定义窗体的callback
define method .formname()
!this .opt.callback = 'show !!formname'
!this .del.callback = 'delete equpment'
!this .apply.callback = 'dunctionname'
!this .applyer.callback = '!this.methodname'
enddefine
5.12.2.2 内置控件方法
!!formname.gadgetname.active = FALSE	$*控件变灰
!!formname.gadgetname.setfocus()		$*把按键锁定到控件,希望我描述的你能懂
5.12.2.3 窗体布局(控件定位)

坐标图:
在这里插入图片描述

每一个控件都有六个隐含变量

XMIN,XCEN,XMAX,YMIN,YCEN,YMAX
可用于定位
在这里插入图片描述

相对定位

参考《PDMS software customisation reference manual》关于syntax的使用
syntax 结构图
在这里插入图片描述

toggle.OnOff at XMIN YMAX+1

在这里插入图片描述

toggle.OnOff at XMIN.gadget1 YMAX.gadget1 +1

在这里插入图片描述
命令定位

PATH down		$*下一个放在与当前的下面,同理参数有(up/left/right)
VDIST [real]	$*定义垂直方向距离
HDIST [real]	$*定义水平方向距离
HALIGN left		$*定义竖向排列时的对齐方式,同理参数有(centre/right)
VALIGN top		$*定义水平排列时的对齐方式,同理参数有(centre/bottom)

示例:
在这里插入图片描述

5.12.2.4 DOCK & ANCHOR 停靠
--希望你明白
DOCK		$*正方向停靠,参数有(top/bottom/left/right/centre)
ANCHPOR		$*斜方向停靠,参数有(T/B/R/L)
--举例
button .butt1 'dock top' dock top
button .butt2 'anchor b+r' $!buttpos anchor R+B
5.12.2.5 窗体控件
--放置图片(PIXMAP)和文字
Para.cwd at 0 0 text '这是一段文字'

--按钮(button)
button [.methodname] '描述' callback'执行内容'

--CE button
button .ce 'ce' callback '执行内容'


--文本(text)
--需要定义宽度和类型(string/real/boolean)
--会收到一个返回值
text [.methodname] width [real] is [type] 

--文本格式化(formatting text)
--FORMAT 对象可以把一个所需的信息转换成数字或者字符串
--给指定数据类型创建一个FORMAT对象,这个可以是一个全局变量用于处理同类的text input gadgets
--一个text input field 控件可以用一个FORMAT对象自动格式化
!!formatlength = object FORMAT()
!!formatlength.Units = 'FINCH'	$*.dp(保留小数位)

setup form !!format
	text.rad'radius' is real format !!integerFmt
exit
q var !!Format.rad.val
<real> 28.123
--PDMS自带四个FORMAT全局变量
!!DistanceeFmt		$*For distance units
!!BoreFmt			$*For Bore Units
!!RealFmt			$*To give a consistent level of decimal places on real numbers
!!IntegerFmt		$*To force real numbers to be integers(0 dp Rounded)

--列表(list)
--可设为多选或单选
--列表是一个数组
list [.methodname] '描述' callback '执行内容' width [real] hei [real]
list .files 'team' width [real] hei [real]

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
--多选控件(Open Callback)
--open callbacks提供了一个在一个多选的列表控件中识别选择或者取消选择的事件的方法
--语法:
list.lis call '!this.mycall('multiple wid 12 hei 3……
--callback的heading为:
fefine method.mycall(!gadget is gadget,!action is string)
--控件作为第一个参数,而事件的类型(SELECT/UNSELECT)作为第二个参数传入方法中。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

在这里插入图片描述

--提示框(tooltips)
--可挂靠在button、text、toggle、option控件上
.......tooltips '这是提示内容'

--复选框
--方形(toggle)
--值通过.val属性设定或取值,返回一个布尔值,默认值为FALSE
--包含一个标签或者图片,他会在toggle按钮的右边显示
toggle .bold '描述'
toggle .gridon '描述' call '执行内容'
if (!this.bold.val eq TRUE) then
	[content]
endif
--圆形(radio)
--一组radio可以给用户固定数目的选择中选择一个,右边可显示他们的名字
--一般一组radio会有一个callback
rgrouop .vert 'Alignment' frame vertical vertical callback '执行内容'
	add tag 'Left' select 'L'
	add tag 'Centre'select 'C'
	add tag 'Right' select 'R'
exit
--selection()方法查询当前的选项,返回所选按钮的rtext,是一个string类型
if (!!formname.vert.selection() eq 'C') then
--rgroup.val表示当前所选radio按钮的序列号
if(!!formname.vert.val eq 3) then

在这里插入图片描述

--有时需要对每个radio 设置callback
i.e.add tag 'Right' select 'R' callback '执行内容'

--下拉菜单(option)
--下拉列表内容可以有字符串或者图片,但不能混合存在
--定义时,必须指定宽度,可自定义标题显示在控件左边
option.colour 'colour' width 20

--存在两个个数相同的列表:display values(Dtext);replacement values(Rtext)
--列表显示内容必须通过数组赋值给控件的Dtext中,即为下拉列表内容
!colourarray[1] = 'black'
.....
!colourarray[5] = 'blue'
!this.colour.dtext = !colourarray

--框架(frame)
frame .framename at 0 3 '我的框架'
	[content]
exit

--窗体成员(form member)
--成员可以是PML任意数据类型,包括数组和对象,变量周期与窗体一致。
setup form !!formname
	member.CE is dbref
	member.string is string
	member.values is array
exit
--窗体成员使用效果与全局变量相同
!!formname.values.append(!newvalue)

--菜单条(Bar Menus)
--界面下拉菜单,在窗体定义时定义,下面定义三个菜单:choose,window,help
setup form !!test dialog size 30 5
	bar
	!this.bar.add('choose',menu1)
	!this.bar.add('window','')
	!this.bar.add('help','')
exit
--定义一个菜单(menu)对象
--窗体定义时,menu命令创建一个命名的菜单对象,使用菜单的add方法可以添加菜单,可以实现:
--执行一个callback
--显示一个form
--显示一个下拉菜单sub-menu
--不同类型之间添加分隔符
menu .menu1
	!this.menu1.add('callback','Query','q ban')		$*菜单query
	!this.menu1.add('form','Hello','hello')			$*菜单hello
	!this.menu1.add('SERARATOR')					$*插入分隔符
	!this.menu1.add('menu','Pull-right','pull')		$*菜单pull-right

在这里插入图片描述

--视图控件(View Gadget)
--可用于显示文字或图像的view
--Volume view
--this example shows the various members of the view element that can be used
--本示例展示了可以使用的视图元素的各种成员
--it uses its own drawlist and works with the global objects
--它使用自己的绘图列表并处理全局对象
--缺少后续补充
!!gphviews
!!gphdrawlists

在这里插入图片描述

--Alpha view
setup form !!testview
	!this.formtitle = 'Alpha view'
	view.input AT x 0 y 0 ALPHA
		height 10 width 30
		channel requests
		channel commands
		exit
exit

在这里插入图片描述

--Plot view
setup form !!testview
	!this.formtitle = 'Plot view'
	view.plot plot height 11 width 30
		curs nocursor
		exit
exit
define method .testview()
	!this.plot.borders = FALSE
	!this.plot.add('path.plt')
endmethod

在这里插入图片描述

--Area View
--目前还未看到资料,后续补充
5.12.2.6 PML1窗体变量

存放在%PDMSEXE%\pdmsui 路径下 $* %PDMSEXE%为PDMS运行程序的安装路径。

$SCALLP = $M/%PDMSUI%/DES/PIPE/$S1
CALLP MPIPE
5.12.2.7 PML2 窗体函数和对象

存放在%PDMSEXE%\pmllib
对应文件后缀
xxx.pmlfnc
xxx.pmlfrm
xxx.pmlobj
call !!mymac() $*调用函数 mymac.pmlfnc

5.13 PML 参数传递
  • 变量都是以string传递的
  • 在变量前加 " $ " 把字符串转换成原本类型

eg:

!comptype = 'elbo'
!dist = 5000
NEW $!comptype
DIST $!dist

后语

  • 因CSDN缺少PML语言高亮的规则,所以全篇采用的是C语言的高亮规则,不是很方便阅读,请谅解。
  • 第一次写博客,难免有疏忽遗漏,用词不当,单词拼写错误,请各位看官指正
  • 第一次使用MarkDown编辑,还在学习汇中,排版可能不是很漂亮,请谅解。
  • 这是参考很多文件以及加入自己理解的学习笔记,可能会有部分表达的不够准确,请谅解。
  • 有些内容还处于缺失状态,希望读者在参考过程中能够提供宝贵意见,我会持续更新这部分内容。
  • 本文为原创,请读者在引用的时候,注明出处。
  • 这是概括内容,后面我会挑我感兴趣的内容展开详细讲解。
  • 我很懒,不要催我做事,谢谢!!
  • 21
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值