MATLAB FOR PROE

作者:J_SUN_SO

e:visualsan@yahoo.cn

1.前言

这篇文章讲的是如何在PROE中使用MATLAB,将其作为一个“计算器”嵌入到PROE,可以将PROE的参数输入到MATLAB中去,在 MATLAB中进行计算,然后提取计算结果。后期将实现以在MATLAB中调用PROE函数,这样就可以和PROE进行交互,将MATLAB的一些优化算 法等工具箱应用于PROE,这种应用将极大地提升PROE的功能。本文使用的MATLAB集成C++类库是MatGear,这是我前期的工作之一(详见 http://www.cnblogs.com/JustHaveFun-SAN/archive/2013/03/09/matGear.html), 是一个开放源代码的项目。

2.内容介绍

用到的技术除了matlab集成技术外,还用到Protoolkit菜单创建,自定义关系式函数和MFC编程技术(只用到对话框)。自定义关系式函 数请参见(http://www.protoolkit.cn/?p=537)。MFC对话框编程也相对简单,可以自己翻阅资料,本文重点阐述 MATLAB相关部分。

3.MATGEAR

MATLAB分局部和全局之分,局部引擎为每个线程启动一个独立的MATLAB线程,全局引擎则公用一个MATLAB线程,而且数据都是共享的,本文将使用全局引擎。MATGEAR中的引擎集成类MEngine 如下:

class MEngine
{
public:
//初始化函数的bSingleUse=1表示启动一个局部引擎,bSingleUse=0表示启动全局引擎。MEngine(BOOL bSingleUse=0);// bSingleUse=0启动全局引擎,计算空间数据共享virtual ~MEngine();BOOL IsEngineOpen();//是否候已经打开引擎BOOL IsSingleUse();//是否是局部引擎BOOL OpenEngine();//打开引擎BOOL CloseEngine();//关闭引擎void SetEngineVisible(BOOL bVisible);//设置引擎是否可见BOOL GetEngineVisible();void PutVar(char *name,MatlabData* d);//向MATLAB输入参数BOOL GetVar(char *name,MatlabData** d);// 获取MATLAB参数//执行命令void EvalString(char* matlabString);const char* GetOutPut();//执行命令后的反馈输出protected:Engine *m_matlabEng;int     m_bInit;char    m_OutBuffer[MAX_OUT_PUT];//局部matlab输出static char    g_OutBuffer[MAX_OUT_PUT];//全局malab输出int     m_bSingleUse;//是否独立开启一个matlab线程,否则将共享一个MATLAB线程。
};

4.自定义关系函数

主要的调用过程为:启动MATLAB->交互(设置变量,读取变量,画曲线…)->关闭MATLAB。

定义的函数接口如下:

MAT_OPEN()       打开MATLAB引擎,重复调用将添加引用计数,只有调用相应次数的MAT_CLOSE才能关闭MATLAB
MAT_CLOSE()     关闭MATLAB
MAT_EVAL(cmd) 执行matlab命令
mat_visiable (bool) 窗口是否可见
MAT_OUT_PUT() 最近一条命令的输出
MAT_PUT_MAT_DOUBLE(name,double_value)   设置或者创建matlab变量值
MAT_PUT_INT(name,int_value)  设置或者创建matlab变量值
MAT_PUT_bool(name,bool_value)  设置或者创建matlab变量值
MAT_PUT_STRING(name,str_value)  设置或者创建matlab变量值
MAT_IS_VAR(name) 判断变量是否存在
MAT_GET_DOUBLE(name)  获得MATLAB变量值
MAT_GET_INT(name)  获得MATLAB变量值
MAT_GET_BOOL(name)  获得MATLAB变量值
MAT_GET_STRING(name)  获得MATLAB变量值

以上每个命令都对应着一个具体的结构体,整个结构体什么如下:

class user_mat_proe_func_define
{
public:
//打开MATLAB
struct m_open{
//0 输入
//1 输出:返回引用计数
static ProError Func_read (ProRelset* relset, ProMdl mdl,
char* ext_func_name,  ProParamvalue* args,
ProAppData data, ProParamvalue* result);
static int UserCustomRelFuncDefine();
};
//执行命令MAT_EVAL
struct m_eval
{
//1 输入:命令表达式
//1 输出:命令输出
static ProError Func_read (ProRelset* relset, ProMdl mdl,
char* ext_func_name,  ProParamvalue* args,
ProAppData data, ProParamvalue* result);
static int UserCustomRelFuncDefine();
};
//关闭MATLAB
struct m_close{
//0 输入
//1 输出:返回引用计数
static ProError Func_read (ProRelset* relset, ProMdl mdl,
char* ext_func_name,  ProParamvalue* args,
ProAppData data, ProParamvalue* result);
static int UserCustomRelFuncDefine();
};

……………………..

}

以执行MATLAB命令函数为例,其具体实现代码如下:

ProError user_mat_proe_func_define::m_eval::
Func_read(ProRelset* relset, ProMdl mdl,
char* ext_func_name, ProParamvalue* args,
ProAppData data, ProParamvalue* result)
{
if (g_engine.IsEngineOpen())
{
char buf[200];
ProWstringToString(buf,args[0].value.s_val);
g_engine.EvalString(buf);
g_last_output=g_engine.GetOutPut();
}else
g_last_output=”MATLAB is not open”;

result->type = PRO_PARAM_STRING;
char buf[200];
strcpy(buf,g_last_output);
ProStringToWstring(result->value.s_val,buf);
return PRO_TK_NO_ERROR;
}
int user_mat_proe_func_define::m_eval::UserCustomRelFuncDefine()
{
ProRelfuncArg* args_array;

/*———————————————————————*\
1个变量,类型均为string,输入不能忽略
\*———————————————————————*/
ProArrayAlloc (1, sizeof (ProRelfuncArg), 1, (ProArray*)&args_array);
args_array [0].type = PRO_PARAM_STRING;
args_array [0].attributes = PRO_RELF_ATTR_NONE;
/*———————————————————————*\
注册函数,只注册读函数,写函数忽略
\*———————————————————————*/
ProRelationFunctionRegister (“mat_eval”, args_array,
Func_read, NULL, NULL,
PRO_B_FALSE, NULL);

return (PRO_TK_NO_ERROR);
}

5.函数注册

在初始化函数中注册自定义函数:

EXTERN_C int user_initialize()
{

user_mat_proe_func_define::m_open::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_eval::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_close::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_visiable::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_put_double::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_get_double::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_put_int::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_set_int::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_put_string::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_set_string::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_is_var::UserCustomRelFuncDefine();
user_mat_proe_func_define::m_output::UserCustomRelFuncDefine();

return 0;

}

6.执行效果

此后启动PROE注册插件,可以看到关系编辑的函数列表上列出了MAT自定义函数:

在关系表达式下输入下面代码

opt=mat_open()
out_put=mat_open()
out_put=mat_eval(“x=1:0.1:10;”)
out_put=mat_eval(“y=sin(x);plot(x,y);”)
opt=mat_close()

执行后发现画出一条正弦曲线,启动matlab需要一点时间:

从matlab中提取参数也有很大用处,PROE提供的函数数量很有限,连随机数rand函数都没有,下面示范一段从matlab中提取变量的代码:

opt=mat_open()
out_put=mat_open()
out_put=mat_eval(“x=rand();”)
out_put=mat_eval(“y=floor(x*100);”)
out_put=mat_eval(“z=’visualsan@yahoo.cn’;”)
out_put=mat_eval(“k=’j_sun_so_from_nuaa’;”)
x=mat_get_double(“x”)
y=mat_get_int(“y”)
z=mat_get_string(“z”)
k=mat_get_string(“k”)
opt=mat_close()

执行后查看参数列表,可以发现几个变量值都在上面:

——————————————————————————————————-end  2013.3.30

转载于:https://www.cnblogs.com/JustHaveFun-SAN/archive/2013/03/30/2990904.html

MATLAB FOR PROE相关推荐

  1. 大学里MATLAB和proe怎么考,ProENGINEER与MATLABsimulink联合仿真设置

    Pro\ENGINEER与MATLAB\simulink联合仿真设置 一.首先确认安装proe时,安装了pro/toolkit,如下为pro/toolkit安装说明 1.在默认安装时是不安装pro/t ...

  2. 基于matlab和proe的曲面建模,Proe曲面建模经典习题:创建电话

    原标题:Proe曲面建模经典习题:创建电话 上一期我们通过曲面建模的方式创建了一个灯罩,这一期就提高点难度,创建一个电话吧!本教程也涉及到不少曲面建模的命令,比如可变截面扫描.边界混合以及曲面修剪和合 ...

  3. matlab曲线导入proe,ProE与Matlab混合曲面建模

    ProE与Matlab混合曲面建模 ProE 在曲面设计时的弱点是它不能直接根据曲面方程来生成曲面; 用于生成曲线的方程也因其提供的函数有限而在复杂程度上受到限制.因此, 在生成有严格数学描述的复杂曲 ...

  4. matlab曲面如何导入proe,Proe如何通过导入外部数据创建曲面和曲线?

    一.通过导入外部数据创建曲线 这里主要介绍通过导入ibl文件的方式来创建曲线.ibl文件一般通过其他工程软件或者三维坐标测量仪等计算或则测量所得到的曲线数据来创建,然后导入到Proe绘制出这条曲线.下 ...

  5. matlab绘制频散曲线,Matlab绘制频散曲线程序代码.docx

    Matlab绘制频散曲线程序代码.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

  6. matlab全安装多大_不理会其他,我只中意T20天正V2.0软件,激活安装教程在这里...

    大家好,我是本文的小编 '软妹',前几篇为大家分享了Proe系列软件的安装步骤,在设计三维设计领域Pro/E是现今主流的CAD/CAM/CAE软件一款软件,特别是在国内产品设计领域占据重要位置.在数控 ...

  7. matlab 流固耦合,详讲流固耦合

    引言近来,航空航天工业在世界上发展迅速,而作为"飞机心脏"的航空发动机是限制其发展的主要因素.目前,航空发动机日益向高负荷.高效率和高可靠性的趋势发展,高负荷导致的高逆压力梯度容易 ...

  8. MATLAB机器人可视化

    1.前记:可能用Robotics Toolbox建立的机器人模型与实际机器人在外观上存在天壤之别吧,直接将CAD软件(UG.SolidWorks.CATIA.Proe等)做好的3D模型导入MATLAB ...

  9. matlab机器人,MATLAB机器人可视化

    1.前记:可能用Robotics Toolbox建立的机器人模型与实际机器人在外观上存在天壤之别吧,直接将CAD软件(UG.SolidWorks.CATIA.Proe等)做好的3D模型导入MATLAB ...

最新文章

  1. 密位测距离口诀_快速测距法(含简单几何说明)
  2. iphone屏蔽系统更新_手贱更新了 iphone系统,想退回到原来的版本,这个方法简单易用...
  3. 使用 Docker Stack 部署多服务集群
  4. bash脚本创建变量_创建一个Bash脚本模板
  5. 中公事业单位计算机模拟试题,事业单位考试计算机基础知识模拟试题汇总—单选题(2)...
  6. 使用axure的团队项目功能
  7. python分组和任务分配_python-使用Celery在多个队列中公平分配任务
  8. 基于web的客栈、公寓、民宿管理平台的设计与实现
  9. 李开复:未曾公布的乔布斯故事
  10. matlab画组合立方体,matlab小程序 画立方体
  11. 最小生成树的第三种求法-Borůvka (Sollin) 算法
  12. 解决网页在浏览器有反应 在手机端没反应问题
  13. 非阻塞IO处理上几个常见问题
  14. 前端实现HTML导出为word文档
  15. Data Structures and Algorithms (English) - 6-10 Sort Three Distinct Keys(30 分)
  16. Sparkthrift-sql执行报错-File does not exist: hdfs://xxx/t_bd_materialgroup/xxx.parquet
  17. 【IoT】产品设计之行业动态:社区团购:巨头们会放弃卖菜这门生意吗?
  18. 机器学习回归(regression)——线性回归(Hung-yi Lee)
  19. 关于halcon基于表面的3d识别定位
  20. 毕设(基于js的firefox的web安全评测系统)----给火狐浏览器安装自己做的扩展插件

热门文章

  1. 疯狂的Web应用开源项目
  2. python编写的心得_Python开发之我的小心得
  3. 中心极限与大数定理律的关系_多元函数的极限、连续性分析
  4. 累计收益是我的收益吗?
  5. 旅游中用稳定器和相机拍视频是怎样的体验?
  6. 如何找到解决问题的方法?
  7. 世界上最贵的车是直通车吗?
  8. 揭秘情场高手的三大套路
  9. 跑外卖仅靠吃苦可以吗?
  10. 线程池工作原理流程图 源码概览线程池工作原理流程图 源码概览