首页/文章/ 详情

Fluent GUI|02 数据交互

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
3年前浏览3382


本文描述在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 empty\n");
   }

 }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之道,本文已经授权,欢迎分享,如需转载请联系作者。

科普求解技术代码&命令Fluent
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-01-05
最近编辑:3年前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2559粉丝 11230文章 729课程 27
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈