8.CADINIP-输入语言(上)
CADINP 输入语言是自由格式的输入,是深入开发CADINT项目的成果,该项目起源于联邦研究和技术部在CAD领域的研究。(参考文献:M.Ahn, K.H.Böckeler, W.Haas / Eingabe Konventionen für CAD-Programme, CAD-Bericht Kfk-CAD 39, Kernforschungszentrum Karlsruhe, 1976).
SOFiSTiK 研发的版本拥有大量的功能拓展,在某些方面对 CADINT 标准版做了一些必要的改动。
当使用块建立和参数替换的功能时,结合SPS和/或WPS实现全部语言功能。CADINP和SPS代表了一种完整的编程语言,用于结构工程计算,不使用任何引导的GUI。过程分两个阶段进行。
• SPS或WPS使用单个文件或嵌入文件组为每个正在使用的程序创建一个输入文件。称为解析。在这个过程中通常用全局定义的文字替代、跳过或者插入一个个块区域。字符串通过$(变量名)来定义。在输入文件中或环境变量中定义或删除。这个时候不进行任何运算,所以例如一个字符串 A 的值为“2+2”,使用表达式$(A)*3 或($(A))*3 是有区别。
• 每个计算程序启动自己单独的CADINP处理器,启动算术计算。CADINP中使用的变量以#开头。不需要任何括号而用数字代替。可以转换为文本输入数据尤其是在注释中,但只能在单个程序的本地范围内使用。
通过这两个阶段的组合,计算机进行完整的结构计算,如同手动计算一样,并生成了包括计算假定以及结果的计算书。
8.1 定义及描述
8.1.1 行(物理语句)
在每一行写入命令。每一行最多有 255 个字符,即屏幕能显示的一行的宽度。
8.1.2 语句(逻辑语句)
类似或有逻辑关系的数据可以组成一个语句。每个语句有名称。语句的划分可以不同于行。
8.1.3 分隔符
语句中的每个值都要通过分隔符分开。分隔符可以是一个或多个空格。
8.1.4 数据
数据可以是数字或者文本(文字)。数字可以是带符号或指数。如果期望输入一个整数,输入的数将被取整到最接近的整数值,例如:
2 0.04 -.5 3.7E8 -0.5E-3
文本(文字)可以是任意组合的字符串。只有前四个字符是有重要的。有可能混淆数字、语句名以及项目,或者文字中有空格或 ’,’ 或 ’;’ 或 ’$’等,应该将文字包含在单引号’’或者双引号""内。
ALFA NODE 1S45 ’A B’ ’1.45’ ’A;B’ "Ab"
从 2010 版开始可以使用所有的国际字符(UTF8),以前的版本受本地编码表的限制。但是对于关键词使用的 4 个字符需准确,并且只允许使用是 ANSI 字符(即非变元音或重音)。
只要不是在两个引号之间,小写字符自动转换为大写字符。只有很少的几个位置需要强制采用大写来避免歧义(例如作用分类)。这个在单位栏将标记 LITnn,而非 Litnn 。
如果字符串包含一个变量(见 ),需要分为三种情况讨论。
·字符串通过引号定义,第一个字符为等号(=)。这种情况下字符串只作为公式输入,如同没有等号,输入的只是字符串而非公式,如果只需要输入字符串这种处理才有意义。
·如果变量定义为文字,将插入该文字而非变量。
·如果变量定义为数字,则该值将被格式化并插入,而不是文字中的变量。
选用文字(而非数字)和包含文字的变量,只允许没有任何计算或索引的#name形式(例如通过#1=25 从 A#1 中得到 A25)。如果需要使用计算数字,则必须在开头添加等号。 因此,#X / 2等同文字“'25 / 2”',而=#X / 5等同数字12.5。
在真正的纯文本中,#()函数必须作为第二个参数的使用格式,例如#(#ALPHA,8.3))。 格式的整数部分选择总字符数(8),而小数部分选择十进制数字(3),即小数点后保留3位有效数字。再次使用#,才可以用任意复杂的计算表达式。
8.2 输入语法
8.2.1 基本输入形式
• 输入由语句组成。
• 输入语句由语句名及数据组成,数据应该符合输入数据的顺序。
• 如果语句同上面的语句,语句名的输入可以省略。
• 语句可以从一行的任意位置开始。
• 数据通过一个或者多个空格间隔开。
8.2.2 默认值
如果数据的位置通过减号(-)输入,程序在该位置设置程序描述的默认值。这在过去被用来跳过不必要执行部分。由于这很大程度上依赖于项目的顺序,项目顺序有时会有点变化,所以取消使用。
如果语句输入的数据少于其语句描述的要求,缺少的位置就假设为默认值。
减号必须通过分隔符号前后隔开。
默认值可以在一个表格的标题栏重新定义。
8.2.3 重复输入
如果数据值通过等号(=)代替,该位置的数值设置为相邻上一语句中的数值,这只适用于语句名称不变的情况。
如果输入了两个等号(==) (中间没有空格!),这个位置以及其所有后面所有的数值都被重复输入。但是不继承上一个语句的位置顺序。
如果上一个命令的数值是数据循环或者数据串,那么数据循环或者数据串也将重复。
重复符号必须通过分隔符。
8.2.4 递增/递减
如果在数据值的地方输入双加或减号(++或 - ),程序将使用上一个语句的相应值递增或递减1。这也适用于字符串、数据串或者数据循环。这只适用于语句名称不变的情况。
递增/递减符号必须通过分隔符前后隔开。
8.2.5 注释
注释符号$、!或者//作用是将该行后面的输入看作注释,程序将忽略这部分输入。所有这些注释运算符应该与注释本身和输入数据在同一行通过分隔符前后隔开。
在+PROG 语句(见 SPS)只允许$符号作为注释使用,并且应该通过分隔符分开。在+SYS 语句不允许有任何注释符号。
8.2.6 续行
两个美元符号$$表示,下一行为该语句的续行。
在$$符号后面的输入看作为注释。
在$$符号的前面必须输入分隔符,这样就不会出现多行的表达方式或者数据序列。
8.2.7 语句分隔
多个语句可以写在一行中。 语句通过分号(;)彼此隔开。
分号不必须通过分隔符前后隔开。
语句分隔对文本输入语句无效(例如 KOPF)。
8.2.8 定位
通过输入关键词可以直接在语句转跳到相应的位置。
举例:
语句通过关键词K1 K2 K3 K4 K5 来定义。下面的数据效果是一样的:
RECORD 1.00 - - 2.00 3.00
RECORD 1.00 K4 2.00 3.00
RECORD K1 1.00 K4 2.00 K5 3.00
RECORD K4 2.00 K1 1.00 K5 3.00
8.2.9 表格
可以输入仅包含项目名称的语句来更改输入数据的顺序。在这种情况下,第二行语句不能包含语句名称,因为这将重新初始化项目序列。
上面例子也可以通过下面的方式输入:
RECORD | K1 | K4 | K5 |
1.00 | 2.00 | 3.00 |
输入数据一直为表格的格式,直到输入新的语句名,或者重复同样的命令。在表格中间也可以对标题栏没有出现的关键词进行定义。
在表格标题栏里可以重新定义关键词的预设值,在关键词后面紧跟一个等号(=)以及新的预设值。
字符
RECORD K1 | K2 | K5=4 |
1 | 2 | 6 |
2 | 5 | |
3 | 6 | - |
等同于下面的输入
RECORD K1 | K2 | K5 |
1 | 2 | 6 |
2 | 5 | 4 |
3 | 6 | 4 |
这种方式能很好的解决模糊文字问题。 对于第一个关键词(即有效的语句名)是文字值的(例如GRP),就可以通过调整关键词顺序来实现表格式输入,无需使用引号:
BEAM | TO | TYPE | PA | FROM=GRP |
1 | TEMP | 30 | ||
2 | TEMP | 25 |
8.2.10 Help-语句
通过 HELP 语句可以列出当前模块可用的语句名。如果语句名的后跟HELP ,可以列出该语句可用的关键词。如果 HELP 跟在语句名以及其关键词的后面,就可以给出该位置允许的输入数据。
该语句主要在交互式错误查找尤为有用。
8.2.11 循环
在数据的位置可以输入一个循环,这样就可以自动生成一系列的数据。循环必须通过括号括起来。其中的数据通过空格或者下划线彼此隔开。循环有两种定义
引导循环
(起始值 结束值 增量) 附属循环
(起始值 增量)
引导循环的约定确定生成数据的个数,每个语句只能定义一次,可以在任意位置出现。附属循环可以定义在任意位置。
循环也可以的是字符串。其中增量也看作字符串,并且只允许为数字。
增量也允许为负数。
如果引导循环的结束值达不到,并且误差超过 0.0001 倍的增量,程序会给出大于9999数值错误提示且停止继续生成。
举例:
NODE (1 5 1) 0 (0.5 -0.1)
生成输入语句:
NODE | 1 | 0 | 0.5 |
NODE | 2 | 0 | 0.4 |
NODE | 3 | 0 | 0.3 |
NODE | 4 | 0 | 0.2 |
NODE | 5 | 0 | 0.1 |
举例:
REIN (A0.1 D0.4 10.1)
生成输入语句:
REIN A0.1
REIN B0.2
REIN C0.3
REIN D0.4
8.2.12 数列
除了循环,还可以输入数列。这些数据通过逗号或者斜杠分开。
数值,数值,数值,数值 例如 1,2,7,9
数列不能包含分隔符,也不能续行。
如果在一个语句定义多个数列,所有数列中数值个数相同,如果还有引导循环的话,也应 保持一致。
每一行数列的最大个数受内储限制。一般情况下至少可以定义 25 个数值。
数列也可以通过固定的字符串(LIT)组成。但是一般不允许数值与字符串或自由定义文字组成列表。
8.2.13 单位的转换
对于每一个数值、值列表或是数据的生成,其数值所对应的单位可以添加在后面的方括号中。例如当程序的默认单位为米时,数值 0.3048 也可以采用 304.8[mm]或者 12[in]来进行单位的转换及输入。该输入方式对隐式和显式单位都适用(参见单位章节)。 CADINP 将会检查某指定的单位是否与所属的单位组协调。
用户也可以通过在表头中输入单位来定义某纵列中所有数值所对应的单位:纵列中任意数值的单位都是可以被单独修改的。在定义表头时,如仅需输入某列数值的默认单位而非数值时,无需填写数值。例如:
NODE X=[m] Y=5.0[m] Z=[mm]
8.2.14 LET - 和 STO - 变量
程序中可以定义变量,并在接下来的语句中引用。命令 LET#(只对当前模块有效)或STO#(变量值可以保存到数据库中)后跟一个变量的名字(最多16个字符,首字符必须为字母),变量后可以带一个数组编号。作为临时的变量,可使用正数。这样变量就可以在任意位置替代数值输入。变量同变量值通过空格分开。至于引号内。由于 LET#以及 STO# 命令不会改变当前的语句名,因此可以在任意位置定义。变量名不能包含特殊字符,或者与数 学方程同名冲突(例如 SIN 或者 SIN30)。除了单一数值,还可以指定为数列、循环或者字符串。变量后面跟着多个数值,相当于定义了一个数组。
变量的单位取决于使用此变量的上下文。 章节中单位定义为[mm]而系统中定义为[m]时通常不能使用相同的变量去设置。但可以将单位分配给变量,然后给定数值值立即转换,该值可以随处使用。如果一个变量了分配单位,将被应用到其他所有变量和表达式。 然而,这也将弹出提示此单位是否被允许用于当前使用。
数组为所有成员指定了为索引为0的项目定义的单位。
如果 # 号开头允许明确标识作为变量名称使用变量。 如果表达式以=号开头,所有未识别的字符将被视为变量名称。
举例:
L E T # P I 3 . 1 4 1 5 ! 定义变量PI
L E T # T X T’ My Text ’ ! 定义字符串
L E T # 1 1 4 ,5 ,6 ! 定义变量 11 ,12 ,13
LET#A 4 ,5 ,6 ! 将 4,5,6 定义到数组 A[0:2]
LET#A ( 2) 5.1 ! 对一个数组单元赋值LET
#A ( 3) 7 ,8 ! 对两个数组单元赋值
LET#1 = A ( 1) ! 读取第二个数组单元值
LET#1 # ( A+1 ) ! 读取第二个数组单元值
LET# #10 12.50 ! 12.5是一个变量
! 该号码保存在变量#10中
LET#4 ##10 ! 将变量#10 中定义号码的变量
! 赋值给变量#4
LET#F ( 100) 0 ! 数组的特征,通过列表和线路来实现
LET#F $$
1 ,2 ,3 ,4 ,5 ,6 ,7 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,21 ,22 ,23 ,24 ,25 ,26 ,27
LET#B 20 [ mm] ! 设置单位
LET#D 1.5 [ m] ! 设置单位
LET#X #B * #D ! 设置单位:#A $$是0.3 [m2]
LET#A #B * #D [ -] ! 设置单位:#A $$是0.3 [ - ]
如果变量赋值计算表达式中,则首先计算表达式,然后计算结果赋给变量。
变量可以通过命令PRT#在结果中输出,用来检验计算。变量名应紧跟在#符号后面,不添加任何空格。TXA、TXE 或者<TEXT>命令可以便捷使用文字文本。
命名的变量也可以一直保存在数据库中。命令STO#name将在数据库中保存此变量的当前值或指定值,以供其它的模块使用。例如:
STO#c 30 $ 将一个变量赋值并且保存在数据库中
如果用户想删除一个保存的变量,就可以通过命令“DEL#变量”来完成。这个命令也允许出现通配符。例如 DEL#OPT*或者 DEL#A?00 可以删除符合该规定的变量。在控制结构(如循环语句或IF语句)中使用DEL#可能会产生意想不到的结果。
在特殊情况下,用户可以对命名过的变量,读取上次保存的值。
RCL#ALL 读取所有己命名的变量
RCL#name 读取一个己命名的变量/数组
RCL#name(3) 读取一个己命名的数组的单元
RCL#name cdbfile 从另一个 CDB 数据库读取变量
预留的变量名
程序运行本身会自动创建一些预留的变量名。用户可以通过 CADINP 输入对这些值进行重新定义。
• 变量VERSION(0)和VERSION(1)将使用版本号(dll)和程序本身进行预设,允许为多个版本定义通用输入数据。
• 变量 PI 值为 3.141593.
• 变量数组 GRP_MASS、SCT_MASS 和 MAT_MASS 以及 GRP_REIN 和 SCT_REIN在输出结构统计信息之后也同样被定义。他们包含了单元质量(MASS),分组(GRP_)钢筋(REIN)以及截面编号(SCT_)或者材料(MAT_),其中索引 0 包含了全部。
• 其他所有的变量为,前三个字符代表相应的程序,后面紧跟一个下划线:
ASE 程序在 ASE_ITER 变量中保存下面的值:
ASE_ITER(0) = 第一个荷载工况号
ASE_ITER(0) = 前一次使用的荷载工况号
ASE_ITER(0) = 前一次的荷载系数
• 数组 AQB_USAGE 中保存了 AQB 程序上次计算任务的使用率百分比。
• 所有以 OPT_开头的变量都保留在OPTIMA 程序。
为了追踪变量可以使用DBG#命令。这样就可以进入文本输出的交互性查错模式。DBG#使用变量#0,因此该值不能用于其它用途。
DBG#0 不输出中间值
DBG#1 输出生成的语句
DBG#2 对所有变量赋值进行额外的输出
DBG#3 对所选择的结构进行额外的输出(CDB 权限)
DBG#4 转为控制窗口输出
DBG#8 控制窗口输入 (交互模式)
DBG# 在选项 15 以及 0 之间切换 (=暂停/继续)
以及
DBG# -2 立即结束所有的执行程序,后续的 TXE 文字在程序出错时仍然输出。
8.2.15数学表达
在输入数值的地方,也可以出现任意的数学表达式。表达式可以包含括号,但是不能包含分隔符号。
可用的计算符号有:
+ - 加法,减法
* / 乘法,除法
** 或者 ^ 指数
== <> 相等/不相等的判断
>= <= 大小的判断
> < 大小的判断 结果为真(1.)或者假(0.)
& | 逻辑值判断,正数部分通过 AND 以及 OR
如果没有给定操作符则假设为乘法。操作符的优先级根据相应的计算法则。 下面为数学表达式中允许使用的方程:
SIN(x),COS(x),TAN(x) 三角函数方程
ATN(x),ATN(y,x) x 或者 y/x 的反正切函数
ARC(x) 角度转化为弧度
SQR(x) 平方根
ABS(x) 绝对值
EXP(x) 自然指数函数
LOG(x) 自然对数函数
LGT(x) 以 10 为底的对数函数
DIV(x,y),xDIVy, DIV(x/y) x/y 的整数值
MOD(x,y),xMODy,MOD(X/Y) x/y 的余数
MIN(x,y,..),MAX(x,y,..) 最小值或最大值
RANDOM(x) 0 到 1 之间的随机数
(x=0 重新预定义)
IIF(expr,val1,val2) 如果表达式不为零,结果为 val1,反之为 val2
数学表达式也可以出现在数列或者循环当中。函数DEG、GON 以及 RAD 可以通过逗号分开,放在表达式的前面。用户也可以保留该设置,并通过该方法来赋值(例如 LET#0 RAD)。
例子:
SIN(30.)+3*COS(45.) 或者 SIN30+3COS45
SIN(RAD,2.435)
100.+MOD(354,32) 或者 100+354MOD32
120.+12.
3(5.0+4.0)
COS(#1) SIN#1 345*#11+##12
表格以及插值:
在读取数组变量的时候还有一个特殊的功能可供使用。如果输入的索引非整数,程序进行插值计算得到该值:
LET#A(0) 10.0
LET#A(1) 14.0
LET#A(2) 16.0
LET#A(3) 17.0
LET#B =A(1.3) => #B = 14.6
同样,用户可以定义复杂的插值计算。对此用户需要定义两个长度相等的数组例如X和 Y。通过字符串进行表格式的特殊赋值:
LET#X 0.0,2.0,3.5
LET#Y 0.0,100.0,100.0
LET#SIG ’TAB(X,Y)’
表达式 SIG(1.73)就可以通过 X 的插值计算,来得到线性相关的 Y 值。如果用户要使用高阶的插值计算,也可以定义第三个数组为导数。
LET#DY -,0,-
LET#SIG ’TAB(X,Y,DY)’
上面的例子中只对中间的点定义了导数,因此得到抛物线形的方程,如果定义了两个端点 的导数,就会得到三次方的样条曲线方程。
变量及字符串:
如果需要将字符串保存在变量当中,同样可以通过 LET/STO 命令实现。(但是必须使用 引号):
LET#TEXT ’ABCDEFGHIJK’
字符串中的每八个字母保存于一个变量中,例如#TEXT(1)变量值为“IJK”可以单独进 行修改,但是不能单独保存每一个字符。另一个方法是读取部分字符串,例如通过#TEXT(3:7) 来读取第 3 个到第 7 个字符。(数字的位置也可以为数学表达式。)字符串变量可以从数据库中读取出来,并可以通过 LET/STO 语句将文本转换为一个或多个数字。通过下面的语句可以对变量#VALT(0)及#VALT(1)进行赋值。
LET#TEXT ’1.23,1.48’
LET#VALT VAL(#TEXT)
8.2.16函数-定义函数
如果一个数学表达式需要被重复调用或在运算过程中某一变量的值会随之改变,则可以通过下列语句来定义一个函数。
LET#F ’=FUN(变量, 函数表达式)’
例如:
LET#F ’=FUN(x,3*#x**3-2*#x**2+5*#x)’
LET#1 #F(1.234)
定义函数时,需由字符串“=FUN(”引导,括号内紧跟所需定义的变量名称及对应的函数 表达式。如果某个变量的名称己经被定义,在调用时它将不会被改变。定义的函数允许递归调用。
8.2.17 LOOP, ENDLOOP - 循环控制及跳转语句
循环控制命令是最强 大的生成方式 。该循环命令类似FORTRAN语言中的 do 语句,或者 BASIC 语言中的 FOR NEXT 语句。循环命令需由字符串 “LOOP”开启,“ENDLOOP”终止。循环的执行次数则由在循环首字符串“LOOP” 后紧跟的数值来定义(默认9999)。当循环尾字符串“ENDLOOP”前的数学表达式的值为 0 或负值时,该循环将会自动终止。如在字符串“Loop”后只定义变量名称而不定义该循环执行的次数时,该变量中单元的个数将变为循环所执行的次数。
循环命令最多能嵌套 32 层但可以包含任意数量的输入单元。循环命令的默认循环次数为 9999次。
每一个循环命令最多能包含 255 行语句。但在同一行中允许输写多个语句,之间需采用“;”号分隔。如仍需 256 行或更多的语句,则需要在循环首的字符串“Loop”后定义该循环命令 所需的行数,例如:
L E T # L O O P S I Z E 语句的所需行数
通过在字符串“LOOP”后给定一个变量名,循环指数也可以定义为变量。指数将从 0 开始计数。该指数将在循环执行过程中变化,但它会在每个循环周期的终止条件评估后恢复。
例如8.1,通过循环命令生成相互间隔 30 度、分布在半圆弧上的径向弹簧:
LET#1 1 , LET#2 0.
LOOP 7
NODE #1 COS ( #2 ) SIN ( #2 )
SPRI #1 #1 DX COS ( #2 ) DY SIN ( #2 ) CP 1. E5
LET#1 #1+1
LET#2 #2+30.
E N D L O O P
除通过指定循环执行次数的方式(LOOP7/ENDLOOP),也可以直接指定循环的终止条件来定义一个循环,如:LOOP/ENDLOOP#2<=180。
例如8.2: 对于双层嵌套循环生成:
L O O P # 1 3
ADEF #1+1
LOOP 2 ; BDIV 0.5 #1+1 ; 0.2 1 ; E N D L O O P E N D L O O P
创建:
1 ADEF1 ; BDIV 0.5 1 ; 0.2 1 ; 0.5 1 ; 0.2 1 ;
2 ADEF2 ; BDIV 0.5 2 ; 0.2 1 ; 0.5 2 ; 0.2 1 ;
3 ADEF3 ; BDIV 0.5 3 ; 0.2 1 ; 0.5 3 ; 0.2 1 ;
如需循环运行某个数列中的所有元素,则可以直接指定该数列的名称(无需#):
LET#A 10 ,22 ,34 ,55 ,76 ,83
L O O P # 1 A !直接输入该数列的名称, 若输入#A 循环将只执行数值 10!
KNOT #1+1 X #A ( #1 )
E N D L O O P
元素的个数也可以存储在某个变量当中,如该变量不存在时则元素的个数为 0:
LOOP#NUM DEF(A) ; ENDLOOP
8.2.18 IF - 逻辑条件
在各程序设计语言中,条件语句都是十分重要的。在CADINP语言中,跳转命令的执行就依赖于条件语句。当字符串“IF”后的表达式值大于0时,该条件命令将被执行。为此, 用户可能需要使用到逻辑表达式。如对文字进行比较,则必须使用逻辑运算符== 或者!=。需区分大小写。操作需考虑两侧的完整字符串,不允许使用括号,括号是字符串的一部分。
例如8.3:
! #1 为控制变量,其值可为 +1 或-1
IF #1
当#1 > 0 时,以下语句将被执行
... ELSE
当#1 < 0 或= 0 时,以下语句将被执行
...
E ND IF
IF #1 ==12
当#1 等于 12 时,以下语句将被执行
... ELSE
当#1 不等于 12 时,以下语句将被执行
...
E ND IF
一个条件块可以包含一系列附加的 ELSEIF 语句:
if ( 条件_1 )
....
e l s e i f ( 条件_2)
....
e l s e i f ( 条件_3 )
....
else
....
e nd if
例:
IF ( #A < 0.3) ! 当满足条件 1
L E T # V A L U E 0.50
E L S E I F ( #A > 1.0) ! 当满足条件 2
L E T # V A L U E 0.70
ELSE
L E T # V A L U E 0.50 +0 .20* ( #A -0.3) ! 或
ENDIF
图 8.1: VALUE随 A变化曲线
VALUE 的值将取决于变量 A。
在不同的 Sofistik 环境及版本下,也可以通过下列方式输入条件语句:
IF ( #版本>=2012)
....
E L S E I F ( #版本==2010 )
....
ELSE // 更早期的SOFiSTiK版本
.... EN DI F
8.2.19 @CDB - 选择一个 CDBASE
CADINP 语言允许访问 SOFiSTiK 任何数据库里的数据。当然,用户需要指定数据库内容 的描述(cdbase.chm)。语法有三个部分,用户能通过@CDB 选择数据库的文件名:
@ CDB 文件名:选择一个任意的数据库,文件名.CDB。默认的数据库为项目数据库。程序不允许用户对该数据库进行显定义。
所有CDB中的数据包含结构相同的多语句,这些语句通过不同的64位索引KWH/KWL引进行编组。通常,每一个数据语句都包含以下两个部分,第一部分包含整数数据,第二部分则包含浮点数据。关于所有语句结构的描述,用户可以在文件cdbase.chm或文件cdbase.cdb中找到
8.2.20 @KEY - 访问 CDBASE
@KEY KWH KWL [SEL1 SEL2 SEL3 SEL4 SEL5 SEL6 IERR]
根据 CDBASE 的描述,选择一个访问索引 KWH/KWL。KWH 为一个 8 字符构成的识别符 而 KWL 为一个可选的数字(如:荷载工况号或者截面号)。KWL 的值,以及 SEL1 至 SEL6 都被自动地预设。
对于特定的用途,可设定过滤准则,其中可包含 6 整数或者 4 个字母关键码值(SEL1 至 SEL6)。不重要的关键码值需在访问函数中被定义为-1。关键码值对应着数据库整数的位置。
语句索引需存在于数据库中,否则用户将得到一个报错信息。读取位置被设置到每一个索 引的起始位置。如果对 IERR 指定一个数字或者变量(例如 999),它的值将被设定为正值。 如果变量#CDB_IER 己被定义,它将包含相同的值。
8.2.21 @() - 访问 CDBASE
某个语句可通过使用数论函数@()进行访问,数学表达式为:
@(position+offset) or @(no,position+offset)
从数据库中读取下一语句,@KEY过滤器中补充“no”最后定义KEYi。输出数值将所储存为“position”,或者如果位置是一个数值,“position”的数值将关联到上次过滤器的选择结果。因此,0或者负值将会在选择的关键码中产生整数值。对某一列索引的访问可以通过“offset”完成。
访问功能将会从当前位置开始。如访问相同或者稍低位置的值,CDBASE 将会读取下一个语句。遇到文件的终止条件时,如用户使用了@(position)程序将会报错,而@(nr,position)循环仅使用一次,并将跳到初始位置。
用户也可以指定两个状态变量。如这些变量被设定为非负,结果将被存储且不显示错误信息。
• CDB_LEN 语句的真实长度
• CDB_IER 错误标记
(0=无错误, 1=语句过短, 2=文件结束, 3=关键码值未定义)。
该错误标记功能可避免程序进入无限循环。
例 8.4: 从项目数据库中获取截面5的有效惯性矩Iy,输入:
@KEY S E C T _ E F F 5
LET#5 @ ( IY )
例8.5:获取荷载工况12下节点101及102的支座反力,输入:
@CDB p r o j e c t 1
@KEY N _ D I S P 12
LOAD 1 PX @ ( 101 , PX ) PY @ ( 101 , PY )
LOAD 2 PX @ ( 102 , PX ) PY @ ( 102 , PY )
例8.6:获取荷载工况12下,分组2中壳单元在节点101及102处内力,输入:
@CDB p r o j e c t 1
@KEY Q U A D _ N F O 12 2 ! 第二组
L E T # 1 0 1 @ ( 101 , mxx ) ! 弯矩m - xx
L E T # 1 0 2 @ ( 102 , myy ) ! 弯矩m - yy
例8.7:获取所有点的支座反力连同尾数0作为荷载,输入详下:
L E T # C D B _ I E R 0
@CDB p r o j e c t 1
@KEY N _ D I S P 12
LOOP ! 所有语句
L E T # 1 0 @NR , @PX , @PY , @PZ
IF ( # C D B _ I E R < 2) & ( #10 < > 0) ! 终止或者开始
IF 0== MOD ( #10 ,10) ! 最终数字0
LOAD #10 PX #11 #12 #13
ENDIF
ENDIF
E N D L O O P # C D B _ I E R < 2 ! 终止语句
更多内容查看CADINIP-输入语言(下)