曾 光Inside PCLWord文件下载.docx
- 文档编号:19854253
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:19
- 大小:40.39KB
曾 光Inside PCLWord文件下载.docx
《曾 光Inside PCLWord文件下载.docx》由会员分享,可在线阅读,更多相关《曾 光Inside PCLWord文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
inputtest.pcl”(init.pcl是Patran启动调用文件,启动Utilities的p3epilog.pcl也是在init.pcl中调用的)。
2变量说明
PCL的变量有效范围有四种:
Global、Classwide、Local及Static。
Global,定义在Class外,在整个Patran运行过程中都能够有效,且可以在任何Function中调用它。
Classwide,定义在Class内,Function外,在整个Patran运行过程中都能够有效,且可以在它所在的Class任何Function中调用它。
Local,定义在Function内,只能在函数调用的时候有效,只能在它所在的Function中调用它。
Static,定义在Function内,在整个Patran运行过程中都能够有效(函数调用结束后,保留结束时的数值),只能在它所在的Function中调用它。
在定义Global和Static型变量时可以不加保留字。
PCL的变量类型有5种:
Integer整数型变量、Logical逻辑型变量、Real实数型变量、String字符型变量及Widget窗口部件变量。
Integer、Logical、Real及String跟在其它语言中的概念相同。
Widget是定义窗口的各种部件的变量类型,类似于windows编程中的句柄(handle)。
我们采用类似于匈牙利表示法的变量命名方式,在每个变量的第一个下划线“_”之前用类型简写表示变量类型。
i表示整数型变量,l表示逻辑型变量,r表示实数型变量,s表示字符型变量,w表示窗口部件变量。
在ilrsw后面带v的话,表示这是个虚拟数组(VisualArray),后面会对其作详细说明。
单独的i、j表示计数变量。
3编程环境设置
IDE(IntergratedDevelopeEnvironment)即集成开发环境,微软的VisualStudio就是最好的例子,Patran没有为PCL准备专门的集成开发环境,一般人都是在文本编辑器中写代码,再在Patran中调试、编译,也有用makefile,即用p3pclcomp.exe编译的方法(最好修改环境变量,在Path栏中加入P3_HOME\bin\exe,P3_HOME为Patran的安装路径)。
PCL也支持类似C和C++的预编译的方式(用#作为开头),但它不能在编译时自动预编译,因为PCL将#作为单排注释的符号,PCL需要先手动预编译,用(P3_HOME)\bin\exe下的cpp.exe,其语法为:
cpp-I源文件目标文件。
再将目标文件编译到库中。
这里介绍用UltraEdit作为代码编辑环境的方法,利用UE的语法高亮显示的功能,将我们自己改写的wordfile.txt拷贝到UltraEdit的安装目录中,或者在UltraEdit中指定,之后后缀名为.pcl的文件就能够高亮显示,其高亮显示的内容分为常规文本、注释(即单排注释)、备选方式列块注释、字符串、数值、关键字、内部函数、跳转、内部常量、与外观相关函数及作者的名字(^_^)。
其中,内部函数是MSC.Documentation2003中PCL相关内容里面所列的函数及appforms.p中的函数,内部常量为ui_forms.p中的宏名,与外观相关函数为appforms.p中的宏名。
便于用户在进行PCL编程时检查函数名是否写错等。
如图所示:
图1在UltraEdit中编辑PCL代码示例
Wordfile.txt及本文所提及的源代码文件均可发邮件到Azure_zg@索取。
4用户界面与数据库信息
参考ui_code.pcl的源代码。
4.1建立用户界面
在Patran的菜单条上添加名为“用户菜单”的菜单条,并给它添加一个菜单项:
“用户界面”。
代码:
w_menubar=uil_primary.get_menubar_id()
w_menu=ui_menu_create(w_menubar,"
cb_menu"
"
用户菜单"
)
ui_item_create(w_menu,"
item_form"
"
用户界面"
FALSE)
在用户界面中,添加4个按钮,分别对应Group、Materials、PropertyRegion及LoadCase列表,按钮下添加一个框架,按下按钮,会在框架中放入相应的列表框。
按“取消”,则隐藏用户界面。
PCL中采用C语言的注释方式,/*与*/之间为注释的内容,还有一种注释方式,与C++中的“//”功能完全一样,只是把符号改为“#”。
添加界面的源代码:
w_form=ui_form_create(@
/*callback*/"
"
@
/*x*/uil_form_sizes.form_x_loc
(1),@
/*y*/uil_form_sizes.form_y_loc
(1),@
/*position*/"
UL"
@
/*width*/uil_form_sizes.form_wid
(1),@
/*height*/uil_form_sizes.form_hgt
(2),@
/*label*/"
界面模板"
@
/*unused*/"
form没有父窗口部件,因为form可以随便移动,更改大小,x、y、width及height只是form初始调用时的位置和大小;
label为显示出来的说明文字;
unused,现在已经不需要设置,但为了兼容原来的PCL程序,仍然保留下来的参数。
还有一种modalform,与form的关系类似于windows编程中模态对话框与非模态对话框之间的关系。
调用modalform的时候,不能够对Patran其它资源作任何操作,直到modalform关闭为止,而且,模态对话框不能够改变大小,所以使用modalform的时候,建议x、y、width及height的值不要使用固定的值,使用appforms.p中提供的相关函数或者宏定义。
代码中uil_form_sizes.form_x_loc
(1)、uil_form_sizes.form_y_loc
(1)、uil_form_sizes.form_wid
(1)及uil_form_sizes.form_hgt
(2)可分别用FORM_X_LOC、FORM_Y_LOC、FORM_WID_SML及FORM_HGT_FULL代替,在文件开头要加上#include“appforms.p”的预编译说明并参照前面的说明进行编译。
添加按钮的源代码:
w_button_group=ui_button_create(@
/*parent*/w_form,@
cb_button_group"
@
/*x*/0.05,@
/*y*/r_y_loc,@
/*width*/0.4,@
/*height*/0.0,@
Group"
@
/*unused*/FALSE,@
/*highlight*/FALSE)
函数ui_button_create共有9个参数,具体参数说明参考MSC.Documentation。
parent说明button的父窗口部件;
callback为button的回调函数;
x、y为button的起点位置;
width、height为button的宽度与高度,将height设为0,则Patran自动选择合适的高度;
Label为显示出来的说明文字;
unused,现在已经不需要设置,但为了兼容原来的PCL程序,仍然保留下来的参数;
highlight,是否高亮显示(把边缘加黑)。
添加框架的源代码:
w_frame=ui_frame_create(@
/*width*/2.3,@
/*height*/2.0,@
列表框"
/*option*/0)
参数option是设置框架是否可以改变大小,默认值为0,不能改变大小;
设置为1,则可以改变大小(注:
这里说的改变大小不是指在使用时用鼠标拖动改变其大小,而是通过函数ui_wid_set改变其大小)。
添加列表框的源代码:
w_list_group=ui_listbox_create(@
/*parent*/w_frame,@
cb_list_group"
@
/*y*/0.15,@
/*width*/2.2,@
/*num_rows*/9,@
Groups"
/*selection_type*/"
SINGLE"
/*sort*/TRUE)
参数num_rows为列表框中同时显示的item的数量,列表框的高度就是每项的高度乘上列表框中显示item的数量,再加上上下边框的高度;
参数selection_type设置选择item的方式,“SINGLE”与“BROWSE”只能选择单个item,“MULTIPLE”与“EXTEND”则可以选择多个item;
参数sort设置是否按照字母顺序排列item。
4.2添加回调函数
PCL中调用函数有三种方式,一是函数的回调函数(各种widget的返回值表见附录1),二是用函数ui_exec_function(类名,函数名)调用(注:
用这种方法调用,如果函数没有参数,后面也要加括号),三是直接调用“类名.函数名(参数表)”。
添加菜单条的回调函数源代码:
functioncb_menu(s_select)
localstrings_select[]
switch(s_select)
case("
test_1.data_init()
ui_form_display("
test_1"
endswitch
endfunction
根据附录1上的说明,menu的回调函数里应该包含一个string型变量作为实参数,实参数不能够指定字长和数组的大小。
选择“用户界面”菜单条后,执行相应的操作:
初始化数据(重新获得当前数据库文件的Groups、Materials、PropertyRegions及LoadCases信息)--test_1.data_init,也可以使用函数ui_exec_function(“test_1”,”data_init”);
显示用户界面--ui_form_display(“test_1”),也可以采用ui_wid_set(form的widgetID,”DISPLAY”,TRUE),此时form的widgetID要设置为Classwide。
添加4个选择按钮的回调函数源代码:
functioncb_button_group
ui_wid_set(w_list_mat,"
DISPLAY"
ui_wid_set(w_list_prop,"
ui_wid_set(w_list_loadcase,"
ui_wid_set(w_list_group,"
TRUE)
最上面的4个按钮的回调函数的功能都是将其它3个的listbox隐藏,只显示自己的listbox。
还有一种方法,只建一个listbox,并且一直显示,将4个按钮的回调函数改为:
ui_item_deleteall(listbox的widgetID)
ui_wid_set(listbox的widgetID,”LABEL”,”Groups”或者其它)
ui_listbox_items_create(listbox的widgetID,Groupsnames,Groupsnames,Group数目,WIDGET_NULL)
添加“确定”、“取消”按钮的回调函数源代码:
functioncb_button_apply
dumps_string_sel
functioncb_button_cancel
ui_wid_set(w_form,"
“确定”按钮的功能是在Patran的脚本窗口显示所选择的Groups、Materials、PropertyRegions或者LoadCases。
“dump变量名”一般是在调试中使用的,因为dump可以将变量名跟变量的值一起显示,此处s_string_sel是string型变量,所以可以用另外一种方式输出,ui_write(“s_string_sel”//s_string_sel)。
ui_write输出一个字符串,“//”表示把前后两个字符串连在一起,如果有其他类型的变量的话,可以用str_from_integer、str_from_real、str_from_logical及str_from_ascii等转换成字符串,比如用ui_write输出名字为i_number的整数型变量,同时输出变量名和变量值,ui_write(“i_number”//str_from_integer(i_number))。
“取消”按钮的功能是将用户界面隐藏,还可以使用ui_form_hide(“test_1”)的方法实现相同的功能。
给Groups、Materials、PropertyRegions及LoadCases添加相应的item。
考虑到在Patran中有可能切换.db文件,Groups、Materials、PropertyRegions及LoadCases中的item可能会更改,但如果每次操作都去提取数据库文件,又太繁琐,数据库庞大的时候,容易因为Patran不稳定而自动退出。
所以采用查表的方法建item,同时每次取表中数据时,判断表中的数据是否是所对应的.db文件的数据。
给四个按钮的回调函数添加一行代码,调用data_init函数。
函数开头判断是否有.db文件打开,再判断数据库是否更改,若有更改,则重新读取数据库信息。
分别读取Groups、Materials、PropertyRegions及LoadCases的ID和名称。
Patran中并不是所有的属性都提供直接读取所有ID的函数。
读取ID有两种方式:
对于有直接读取函数的属性(如PropertyRegions和LoadCases),就直接使用Patran提供的函数;
对于没有直接读取函数的属性(如Groups和Materials),采用对所有可能的ID进行测试的方法获取属性的ID。
4.3使用Patran提供的函数获取ID
PropertyRegions及LoadCases都有直接获取ID的函数。
PropertyRegions使用函数db_get_all_region_ids,然后使用函数db_get_region_definition获取PropertyRegions的NAME。
LoadCases使用函数res_utl_get_loadcases,再用函数res_data_bulk_get_loadcases获取LoadCases的NAME。
获取PropertyRegions信息的源代码:
localintegeri_temp(10),@
i
db_count_region_ids(i_prop_num)
if(i_prop_num==0)then
ui_write("
没有属性区域!
!
return
endif
sys_reallocate_array(iv_prop_ids,1,i_prop_num)
sys_reallocate_array(sv_prop_names,1,i_prop_num)
db_get_all_region_ids(i_prop_num,iv_prop_ids)
for(i=1toi_prop_num)
db_get_region_definition(iv_prop_ids(i),@
sv_prop_names(i),@
i_temp
(1),@
i_temp
(2),@
i_temp(3),@
i_temp(4),@
i_temp(5),@
i_temp(6),@
i_temp(7),@
i_temp(8),@
i_temp(9),@
i_temp(10))
ui_item_create(w_list_prop,sv_prop_names(i),sv_prop_names(i),FALSE)
endfor
首先用函数db_count_region_ids获取当前模型中PropertyRegions的数目,然后根据这个数目重新分配iv_prop_ids及sv_prop_names数组的大小,再用函数db_get_all_region_ids获取所有的PropertyRegions的ID,最后用函数db_get_region_definition获取PropertyRegions的NAME,函数db_get_region_definition获取的PropertyRegion的其它信息,全部放到临时数组i_temp中。
获取LoadCases信息的源代码:
localintegeriv_temp_1(VIRTUAL),@
iv_temp_2(VIRTUAL),@
iv_temp_3(VIRTUAL),@
i
res_utl_get_loadcases(i_loadcase_num,iv_temp_1,iv_temp_2)
if(i_loadcase_num==0)then
没有计算结果!
sys_reallocate_array(iv_loadcase_ids,1,i_loadcase_num)
sys_reallocate_array(sv_loadcase_names,1,i_loadcase_num)
sys_allocate_array(iv_temp_3,1,i_loadcase_num)
res_data_bulk_get_loadcases(i,@
iv_loadcase_ids,@
iv_temp_2,@
iv_temp_3,@
sv_loadcase_names)
ui_listbox_items_create(w_list_loadcase,@
sv_loadcase_names,@
sv_loadcase_names,@
i_loadcase_num,@
WIDGET_NULL)
sys_free_array(iv_temp_1)
sys_free_array(iv_temp_2)
sys_free_array(iv_temp_3)
res_utl_get_loadcases函数获取LoadCases的数目及ID,res_data_bulk_get_loadcases函数在这里主要是用于获取LoadCases的NAME。
此处是用函数ui_listbox_items_create给LoadCase列表框添加item,最后一个参数是说明不需要给每个item申请一个widgetid。
4.4使用测试的方法获取ID
Groups及Materials都没有直接获取ID的函数,所以只有采用一个个进行测试的方式获取ID。
具体的做法是,先获得数据库中Groups和Materials的数目,再从1开始测试,直到获得全部的ID号。
获得Groups的数目是使用函数db_get_maximum_id,获得Materials的数目是使用函数db_entity_counts。
用函数db_get_group_name获取数字对应的GroupNAME,如果该数字不是某一个Group的ID的话,则输入变量的值不会改变;
如果变量的值改变了,说明该数字是一个Group的ID。
就用这种方法测试Groups的ID,直到得到全部的ID。
测试Materials的ID也是采用这种方法,只是把函数改为db_get_material。
获取Groups信息的源代码:
localinteger
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 光Inside PCL Inside