热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATLABFORPROEDoJustForFun

MATLABFORPROE作者:J_SUN_SOe:visualsan@yahoo.cn1.前言这篇文章讲的是如何在PROE中使用MATLAB,将其作为一个“计算器”嵌入到P

MATLAB FOR PROE

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


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • 设备模型三(潜谈sysfs)
    前言引出一个问题:假设sysaxx,xx是kobja的属性文件,当对xx进行写操作时,即echo‘1’sysaxx实际上,调用了kobja的ktype中定义的接口函 ... [详细]
  • Ihavebeenworkingwithbufferingafileonmylocaldrivetoparseandobtaincertaindata.Forte ... [详细]
  • 图片添加二维码水印教程
    本博客介绍一下用jdkawt实现图片加文字水印和图片水印的方法一、图片文字水印原来图片加上文字水印后图片二、图片加图片水印原来图片:水印图片:添加水印后的图片: ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 与.Net大师Jeffrey Richter面对面交流——TUP对话大师系列活动回顾(多图配详细文字)...
    与.Net大师JeffreyRichter面对面交流——TUP对话大师系列活动回顾(多图配文字)上周末很有幸参加了CSDN举行的TUP活动, ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
author-avatar
诚仔儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有