吾生有涯 学海无涯
析模有界 知识无界

Fluent GUI|02 数据交互

内容纲要

本文描述在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之道

赞(6) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Fluent GUI|02 数据交互》
文章链接:https://www.topcfd.cn/13919/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册