野火论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始


查看: 26399|回复: 55

[原创] Proe Wildfire 5.0二次开发之第一个拉伸特征的创建

[复制链接]

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
发表于 2013-4-13 22:35 | 显示全部楼层 |阅读模式
一个偶然的机会接触了proe的Toolkit二次开发,陷入一阵混乱与迷茫。所面对的像是一个谜,它就在那里,我却始终无力穿透。
实话讲,proe二次开发入门不那么容易。太多的函数与定义让人眼花缭乱。但这恰好增加了学习的动力与刹那间领悟的喜悦感。
很自然的,如果要想二次开发,我们心中的第一个疑惑往往是,怎么用代码写出一个自动创建拉伸特征的程序?
经过一段时间自己慢慢的摸索,参考一些书籍和资料,二次开发算是入门了。看到野火论坛偌大的二次开发板块,没有一个讲特征创建的,我不敢不分享自己体会到的一些二次开发的内容。容我喝一口热翔慢慢道来。
另外由于本人比较懒,可能要多次写完。但既然发帖,就不会是太监贴,并且发出来之后也是我完成帖子的动力,让我直接写完发出来我就不一定有这个耐心。当然写完看的人可能也不多,只因太多的人不懂程序代码编译通过的快乐。

[ 本帖最后由 zhangweilst 于 2013-4-13 23:57 编辑 ]

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 22:37 | 显示全部楼层
发现论坛发帖版面效果不太好,容易让人不爱读。不多说,转入正题。
这是一个入门教程,相信论坛有不少大神在,轻拍。

[ 本帖最后由 zhangweilst 于 2013-4-13 22:38 编辑 ]
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 22:43 | 显示全部楼层
第一个困难是代码的调试。要调试程序,只编好创建特征的代码是不够的,在这之前需要先用到菜单的一些知识。我们需要先在Proe菜单条上增加自己的自定义菜单,并用这个菜单在Proe环境下来运行我们编写的代码。
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 22:47 | 显示全部楼层
在这之前需要先配置好程序编译环境。5.0的标配是Visual Studio2008,在论坛里和百度文库里面可以找到很详细的教程,相信搞定它不是很难。如果不行可以找我。
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 22:52 | 显示全部楼层
运行二次开发程序时,需要有一个初始化——基本上是菜单的加载。初始化的过程是在函数extern "C" int user_initialize()中进行的。另外还有一个extern "C" void user_terminate(),这个是在程序结束后调用的。它们分别叫做入口函数和出口函数。程序就是从入口函数开始执行的。下面是函数代码。

[ 本帖最后由 zhangweilst 于 2013-4-14 00:09 编辑 ]
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 22:57 | 显示全部楼层
// Toolkit includes
#include "ProMenubar.h"
#include "ProMenu.h"
#include "ProUtil.h"
#pragma comment(lib, "netapi32")

static uiCmdAccessState AccessDefault(uiCmdAccessMode access_mode)
{
        return (ACCESS_AVAILABLE);
}

// 动作函数
void ActionFunction_1()
{
        AfxMessageBox("命令尚未启用。");
}

void ActionFunction_2()
{
        AfxMessageBox("命令尚未启用。");
}

// 入口函数
extern "C" int user_initialize()
{
        AfxEnableControlContainer();
        ProError status;
        ProName menumsgfile;
        uiCmdCmdId   cmd_id_1,cmd_id_2;

        //在Help菜单的右边添加“二次开发菜单”
        ProStringToWstring(menumsgfile,"usermessage.txt");
        status=ProMenubarMenuAdd("MainMenu","ProtkMenu","Help",PRO_B_TRUE,menumsgfile);

        ProCmdActionAdd("Action_1",(uiCmdCmdActFn)ActionFunction_1,12,AccessDefault,PRO_B_TRUE,PRO_B_TRUE,&cmd_id_1);

        ProMenubarmenuPushbuttonAdd("MainMenu","PushButton_1","ProtkButton1","Button1 to do something",
                NULL, PRO_B_TRUE, cmd_id_1, menumsgfile);

        ProCmdActionAdd("Action_2",(uiCmdCmdActFn)ActionFunction_2,12,AccessDefault,PRO_B_TRUE,PRO_B_TRUE,&cmd_id_2);

        ProMenubarmenuPushbuttonAdd("MainMenu","PushButton_2","ProtkButton2","Button2 to do something",
                NULL, PRO_B_TRUE, cmd_id_2, menumsgfile);

        return(0);
}

// 出口函数
extern "C" void        user_terminate()
{
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
}
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 23:10 | 显示全部楼层
第一部分是头文件,头文件在proe的toolkit目录下可以找到,可以随时查看。下面一个函数是设置按钮(即菜单下的PushButton)状态的,可以暂时不用管它。
下面是两个动作函数。动作函数就是在点击按钮时所执行的那一部分代码。每个按钮对应一个不同的动作函数,以实现不同的功能。下面就会讲怎样用动作函数。
下面就是我们说的入口函数了。在入口函数里面我们在菜单条上添加了一个“ProtkMenu”菜单:status=ProMenubarMenuAdd("MainMenu","ProtkMenu","Help",PRO_B_TRUE,menumsgfile);
并添加了两个按钮:
ProMenubarmenuPushbuttonAdd("MainMenu","PushButton_1","ProtkButton1","Button1 to do something",
                NULL, PRO_B_TRUE, cmd_id_1, menumsgfile);
ProMenubarmenuPushbuttonAdd("MainMenu","PushButton_2","ProtkButton2","Button2 to do something",
                NULL, PRO_B_TRUE, cmd_id_2, menumsgfile);
在添加完按钮后,我们用以下两条语句分别将两个按钮与其动作函数联系起来:
ProCmdActionAdd("Action_1",(uiCmdCmdActFn)ActionFunction_1,12,AccessDefault,PRO_B_TRUE,PRO_B_TRUE,&cmd_id_1);
ProCmdActionAdd("Action_2",(uiCmdCmdActFn)ActionFunction_2,12,AccessDefault,PRO_B_TRUE,PRO_B_TRUE,&cmd_id_2);
这里我们添加了两个按钮并指定了两个动作函数。读者可以自行添加更多的按钮。
下面回到函数的开始。开始是一些变量的定义,然后紧接着的一条语句是 ProStringToWstring(menumsgfile,"usermessage.txt");
这条语句的作用是将文本文档"usermessage.txt"(下面将会重点介绍这个文本文件)中的字符串转化成宽字节类型字符串(Toolkit多用宽字节字符串)并赋给变量menumsgfile。这个文本文件在toolkit中叫信息文件,我们用它来指定菜单显示的内容,比如菜单的名字,按钮的名字,和鼠标指向按钮时显示的提示语。
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 23:15 | 显示全部楼层
这个文本文件的内容如下:
ProtkMenu
ProtkMenu
#
#
ProtkButton1
ProtkButton1
#
#
ProtkButton2
ProtkButton2
#
#
Button1 to do something
Button1 to do something
#
#
Button2 to do something
Button2 to do something
#
#

很容易看出,每四行为一个单元,分别指定需要的内容。读者可以在调试程序的时候仔细体会这个文本文件的内容及书写规则。
这个文档存放在一个text文件夹下。在下面将怎样运行程序时会讲到指定这个文本文件的路径。
我把这个文本档先传上来。

[ 本帖最后由 zhangweilst 于 2013-4-13 23:22 编辑 ]

usermessage.rar

166 Bytes, 下载次数: 47

回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 23:20 | 显示全部楼层
这样入口函数就介绍完了。这个入口函数初始化了一个菜单,并在菜单下添加了两个按钮(PushButton),并将两个动作函数与按钮相关联,用户每次点击按钮时,就会执行相应的代码。在这里点击按钮后会弹出一个对话框,并显示“命令尚未启用。”。后面一个函数出口函数不多说,在程序结束后进行一些处理。
回复 支持 反对

使用道具 举报

4

主题

86

回帖

3

威望

助工

Rank: 2

积分
115
 楼主| 发表于 2013-4-13 23:26 | 显示全部楼层
程序编译成功后,将会生成一个dll文件,这就是我们的程序。下面说怎样运行这个程序。
需要创建一个Prokt.dat文件,在该文件中指定程序的名字,dll文件的路径和上面提到过的文本文件的路径,另外还有其他一些设置选项。我的Protk.dat文件的内容如下:
name ProtkMenu
startup dll
allow_stop TRUE
delay_start FALSE
exec_file C:\Users\Administrator\Desktop\Protk_template\Release\Protk_template.dll
text_dir C:\Users\Administrator\Desktop\Protk_template\text
revision 1000
end

载入Protk.dat的方法也很简单,可以直接在config里面增加下面一行:
protkdat C:\Users\Administrator\Desktop\Protk_template\Protk.dat
也可以在proe工具->选项里面设置。正确设置后,proe启动时将自动启动该程序。
注意,待会我会把所有源文件发上来,下载后要注意更改上面的两个路径为你自己存储源文件的路径,还有config文件的路径也要相应的改变。

[ 本帖最后由 zhangweilst 于 2013-4-13 23:38 编辑 ]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站为非营利性站点,部分资源为网友搜集或发布,仅供学习和研究使用,如用于商业用途,请购买正版。站内所发布的资源,如有侵犯你的权益,请联系我们,本站将立即改正或删除。

QQ|手机版|小黑屋|野火论坛(©2007~2024) ( 苏ICP备11036728号-2 )苏公网安备 32039102000103号

GMT+8, 2024-4-20 15:16 , Processed in 0.101725 second(s), 26 queries .

快速回复 返回顶部 返回列表