本文描述在Fluent GUI中数据的处理方式。
数据处理包含两部分内容:获取GUI中的数据以及与求解器通讯。
1 获取控件数据
Fluent提供了一些函数用于获取用户在控件中输入的值,这些函数包括:
; 分别获取整数输入框、实数输入框、文本输入框、复选框、列表框中的值
; controlName为控件变量
(cx-show-integer-entry controlName)
(cx-show-real-entry controlName)
(cx-show-text-entry controlName)
(cx-show-toggle-button controlName)
(cx-show-list-selections controlName)
在实际应用过程中,可以定义一个变量用于接收这些控件返回的数据,之后就可以在回调函数中对这些数据进行处理。
如下面的例程:
(define (apply-cb . args)
; 获取输入框中的数据并存储到变量中
(define ivalue (cx-show-integer-entry ints) )
(define rvalue (cx-show-real-entry reals))
(define tvalue (cx-show-text-entry txt))
; 输出数据到TUI窗口
(ti-info ivalue)
(ti-info rvalue)
(ti-info tvalue)
)
(define update-cb #f)
(define my-dialog-box (cx-create-panel "Field Demo" apply-cb update-cb))
(define table (cx-create-table my-dialog-box "This is an example"))
(define ints (cx-create-integer-entry table "For Ints" 'row 1))
(define reals (cx-create-real-entry table "For Reals" 'row 2))
(define txt (cx-create-text-entry table "For Text" 'row 3))
; 显示panel
(cx-show-panel my-dialog-box)
程序运行结果如下图所示(文本框中的数据是随便输入的)。
点击OK按钮后TUI窗口如下图所示。
2 RP变量
获取GUI控件的数据比较简单,但是很多时候不仅是获取GUI数据,还经常要和UDF进行数据通讯,此时需要利用RP
变量。
RP变量提供了一种将数据从GUI(在Scheme中)传递到已编译或解释的UDF(在C中)的方法,其可以在GUI和UDF上访问RP变量。因此要将数据从GUI传递到UDF,只需在GUI代码中创建RP变量并为其赋值,之后即可在UDF代码中访问这些变量。
2.1 创建RP变量
在Scheme中创建RP变量,需要使用rp-var-define
宏。如下面的代码创建了一个名为myInt的整数型RP变量,其默认值为1。
(rp-var-define 'myInt 1 'integer #f)
通常为了防止重复地创建RP变量,在创建RP变量之前最好检查该RP变量是否已经定义。一种简单的方法是创建一个函数,该函数在创建RP变量之前先检查该名称是否存在。如可以将下面的make-new-rpvar函数复制到Scheme文件中,用于确保不重复创建RP变量。
(define (make-new-rpvar name default type)
(if (not (rp-var-object name))
(rp-var-define name default type #f)
)
)
(make-new-rpvar 'myInt 1 'integer)
支持的数据类型包括:
类型 | 类型注释 |
---|---|
real | 实数,用于实数型输入框 |
integer | 整数,用于整数型输入框 |
boolean | 布尔型,用于单选/复选框 |
string | 字符串,用于文本输入框 |
string-list | 列表,用于列表框与下拉列表框 |
2.2 创建RP变量并在UDF中访问
当RP变量创建后,可以利用rpsetvar
函数更改变量的值。
如利用下面的代码修改变量myInt的值为3:
(rpsetvar 'myInt 3)
需要注意,为RP宏指定值时,值的类型必须与变量创建时指定的类型一致,否则会出错。
rpsetvar
函数通常用在回调函数中,如用于apply-cb中就可以直接收集GUI控件的值,并在UDF中访问这些值。如下面的例程代码:
(define (make-new-rpvar name default type)
(if (not (rp-var-object name))
(rp-var-define name default type #f)))
; 定义3个用于交互的变量
(make-new-rpvar 'myudf/real 0 'real)
(make-new-rpvar 'myudf/int 20 'integer)
(make-new-rpvar 'myudf/string "" 'string)
; 定义一个函数,用于处理GUI界面
(define gui-dialog-box
(let (
(dialog-box #f)
(table)
(box1)
(real)
(int)
(string)
)
(define update-cb #f)
; 定义回调函数,点击按钮OK后调用
(define (apply-cb . args)
(rpsetvar 'myudf/int (cx-show-integer-entry int)) ; 将GUI中的控件值赋值给变量
(rpsetvar 'myudf/real (cx-show-real-entry real))
(rpsetvar 'myudf/string (cx-show-text-entry string))
(%run-udf-apply 2) ; 调用UDF宏,这里的2为UDF宏中的mode参数
)
; 创建GUI元素
(lambda args
(if (not dialog-box)
(let ()
(set! dialog-box (cx-create-panel "myUDF Dialog Box" apply-cb update-cb))
(set! table (cx-create-table dialog-box "" 'border #f 'below 0 'right-of 0))
(set! box1 (cx-create-table table "Simple Data Inputs" 'row 0))
(set! int (cx-create-integer-entry box1 "For Ints" 'row 2))
(set! real (cx-create-real-entry box1 "For Reals" 'row 3))
(set! string (cx-create-text-entry box1 "For Text" 'row 4))
)
)
(cx-show-panel dialog-box)
)
)
)
(gui-dialog-box)
定义UDF宏:
#include "udf.h"
// 当点击GUI界面中的OK按钮时运行此宏
DEFINE_EXECUTE_FROM_GUI(check, libudf, mode)
{
// 这里的mode对应于scm中的回调函数中的相应变量
if(mode == 2){
Message0("The integer is '%d'n", RP_Get_Integer("myudf/int"));
Message0("The real number is '%f'n", RP_Get_Real("myudf/real"));
if(strlen(RP_Get_String("myudf/string")) != 0){
Message0("The string is '%s'n", RP_Get_String("myudf/string"));
}else{
Message0("The string is emptyn");
}
}else{
Message0("Error!n");
}
}
编译UDF并加载,运行Scheme后,在界面输入框任意输入数值,如下图所示。
点击OK按钮后运行结果如下图所示。
注:这里BUG挺多的,经常出现在UDF中找不到定义的rp变量的情况。
”
在UDF中访问rp变量的宏如下表所示。
UDF宏 | 说明 |
---|---|
RP_Variable_Exists_P("variable-name") | 判断rp变量是否存在,若存在返回true,否则返回false |
RP_Get_Real("variable-name") | 返回实数rp变量的值 |
RP_Get_Integer("variable-name") | 返回整数rp变量的值 |
RP_Get_String("variable-name") | 返回字符串rp变量的值 |
RP_Get_Boolean("variable-name") | 返回布尔型rp变量的值 |
Get_Input_Parameter("variable-name") | 返回自定义变量的值 |
RP_Set_Real("variable-name", ...) | 设置实数变量值 |
RP_Set_Integer("variable-name",...) | 设置整数变量值 |
RP_Set_String("variable-name",...) | 设置字符串变量值 |
RP_Set_Boolean("variable-name",...) | 设置布尔变量值 |
2.3 在GUI中访问RP变量
在GUI中有时也需要访问RP变量,这可以使用%rpgetvar
来获取。
此宏常用在update-cb回调函数中,用于为控件赋初值,如下面的代码:
(cx-set-integer-entry localInt (%rpgetvar 'rpInt))
2.4 在TUI中访问RP变量
在TUI中访问rp变量,可以使用rpgetvar
,如下图所示。
2.5 调用TUI命令
在GUI中调用TUI可以使用下面的命令ti-menu-load-string
,如可以使用下面的命令加载scm文件。
(ti-menu-load-string "file read-journal Schemefile1.scm")
在实际使用过程中,可以将任何tui脚本放到括号中进行调用,也可以直接加载jou文件。
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册