iCAx开思工具箱

标题: 【原创】手把手Pro/E二次开发 [打印本页]

作者: TOOL    时间: 2003-6-23 22:28
标题: 【原创】手把手Pro/E二次开发
为了增加Pro/E开发的人气我也发些介绍文章:)
我很喜欢这个论坛,从这里发现有很多高手,
使我发现自己要不断努力
去年自己学习pro/E二次开发的时候真是艰难,同行很少,资料很少
当时icax还没有二次开发论坛,走了很多弯路,花了很多时间
现在给大家比较详细的探讨一下Pro/E二次开发
虽然Pro/E的开发上我得水平一般,但是我很有热情
希望我能使很多朋友容易入门少走弯路,有更多的人介绍自己的经验
共同学习,共同提高……
作者: TOOL    时间: 2003-6-23 22:31
二次开发工具
PRO/ENGINEER在提供强大的设计、分析、制造功能的同时,也为用户提供了多种二次开发工具。常用的二次开发工具有:族表(Family Table)、用户定义特征(UDF)、Pro/Program、J-link、Pro/toolkit等。
1)族表(Family Table)
通过族表可以方便的管理具有相同或相近结构的零件,特别适用于标准零件的管理。族表通过建立通用零件为父零件,然后在其基础上对各参数加以控制生成派生零件。整个族表通过电子表格来管理,所以又被称为表格驱动。
2)用户定义特征(UDF)
用户定义特征是将若干个系统特征融合为一个自定义特征,使用时作为一个整体出现。系统将UDF特征以gph文件保存。UDF适用特定产品中的特定结构,有利于设计者根据产品特征快速生成几何模型。
3)Pro/Program
Pro/ENGINEER软件对于每个模型都有一个主要设计步骤和参数列表—Pro/Program。它是由类似BASIC的高级语言构成的,用户可以根据设计需要来编辑该模型的Program,使其作为一个程序来工作。通过运行该程序,系统通过人机交互的方法来控制系统参数、特征出现与否和特征的具体尺寸等。
4)J-link
J-link是PRO/ENGINEER中自带的基于JAVA语言的二次开发工具。用户通过JAVA编程实现在软件PRO/ENGINEER中添加功能。
5)Pro/Toolkit
Pro/Toolkit同J-link一样也是Pro/E自带的二次开发工具,在Pro/Toolkit中,PTC向用户提供了大型的C语言函数库,函数采用面向对象的风格,通过调用这些底层函数,用户能方便而又安全地访问Pro/ENGINEER的数据库及内部应用程序,进行二次开发,扩展一些特定功能。
作者: TOOL    时间: 2003-6-23 22:36
安装完Pro/Toolkit后的目录为:
作者: TOOL    时间: 2003-6-23 22:44
二次开发实例步骤:
打开VC,新建工程,名为Toolkit,选择动态链接库dll方式
作者: TOOL    时间: 2003-6-23 22:46
简单介绍一下开发模式:
Pro/Toolkit下的开发的程序有两种模式:同步模式(Synchronous Mode)和异步模式(Asynchronous Mode)。同步模式下,Pro/E根据注册文件中的信息启动应用程序,Pro/Toolkit应用程序和Pro/E产生各自的进程,程序的控制权在两个进程之间切换。该应用程序不能够独立于Pro/E而运行。在异步模式下,Pro/Toolkit应用程序和Pro/E能够进行各自的操作,在通信方面,异步模式使用远程调用(Remote Procedure Calls,RPC)方式,程序(含有独立主函数)能独立于Pro/E启动。由于异步模式采用远程调用,程序运行速度相比同步模式慢很多,整合性也不好,所以一般基于Pro/E的Toolkit开发采用同步模式。在同步模式下又有两种开发方式:动态链接库(DLL Mode)和多进程(Multiprocess 或Spawned Mode)。前者为的动态连接库文件,无自身主程序函数,直接连接于Pro/E进行程序调用。后者为.exe文件,有独立的主程序和Pro/E进行相连接。一般为了调试方便,开发程序时可以采用多进程模式,在程序完成时,采用动态连接库提高程序运行效率。
作者: TOOL    时间: 2003-6-23 22:49
选择dll工程建立好之后
进行相关路径的设置:
作者: TOOL    时间: 2003-6-23 22:50
添加链接库(非常重要的一步)
作者: TOOL    时间: 2003-6-23 22:52
晚了
明日待续……
作者: zine    时间: 2003-6-24 00:24
快点天亮 ... ... 我等
作者: TOOL    时间: 2003-6-24 07:39
接下来就可以编写程序了:
  
Pro/TOOLKIT应用程序必须包含有两个函数:
user_initialize()
user_terminate()
Pro/E初始化且创建图形窗口后,Pro/TOOLKIT调用函数user_initialize()
该函数具有多个参数,用户根据需要使用,这些参数提供了运行Pro/E的命令行参数信息和版本号
Pro/E结束时,Pro/TOOLKIT调用函数user_terminate()
  
下面为开发TOOLKIT应用程序的起点
  
#include "roToolkit.h"
int user_initialize()
{
    return(0);
}
void user_terminate()
{
}
作者: TOOL    时间: 2003-6-24 07:40
下面介绍添加菜单的开发过程:
作者: TOOL    时间: 2003-6-24 07:42
包括头文件:
#include &ltroToolkit.h>
#include &ltroMenu.h>
#include &ltroMenuBar.h>
#include &ltroUtil.h>
作者: TOOL    时间: 2003-6-24 07:52
再此TOOLKIT程序和VC的交互无需使用动态库调用(编写两个动态库)
编写入口及菜单添加函数:
/*====================================================================*\
FUNCTION : user_initialize()
PURPOSE  : Pro/TOOLKIT程序的总入口,完成初始化工作
\*====================================================================*/
extern "C" int user_initialize(
    int argc,      
    char *argv[],
    char *version,  
    char *build,
    wchar_t errbuf[80])
{
  
 &nbsproError status;
  uiCmdCmdId  cmd_id;
 &nbsproFileName mf;
  
 &nbsproStringToWstring(mf,"usermsg.txt");
  
  status = ProMenubarMenuAdd ("Menu0", "USER Menu0",  
        "Help", PRO_B_TRUE, mf);
  // 0添加父菜单Menu0
  
  status = ProMenubarmenuMenuAdd ("Menu0", "Menu1", "USER Menu1",  
            NULL, PRO_B_TRUE, mf);
  添加弹出式菜单Menu1
  
  status = ProCmdActionAdd("Menu2",  (uiCmdCmdActFn)TestAccessDefault,
    uiCmdPrioDefault, TestAccessDefault,  PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]
  -1菜单Menu2动作
  
  status = ProMenubarmenuPushbuttonAdd ("Menu1", "Menu2",  
            "USER Menu2", "USER Menu2 help", NULL, PRO_B_TRUE,cmd_id, mf);
  -1添加菜单Menu2
  
  return 0;
}
作者: TOOL    时间: 2003-6-24 07:54
结束:
作者: TOOL    时间: 2003-6-24 07:58
编译调试:
作者: zzabccn    时间: 2003-6-24 07:58
再讲讲对话框调用,好吗?谢谢.
作者: TOOL    时间: 2003-6-24 08:01
生成Toolkit.dll后,编写菜单消息文件usermsg.txt:
作者: TOOL    时间: 2003-6-24 08:03
zzabccn wrote:
再讲讲对话框调用,好吗?谢谢.

先按照进度,不能为你一个专门讲
我会讲到的
作者: TOOL    时间: 2003-6-24 08:06
编写注册文件:
作者: TOOL    时间: 2003-6-24 08:09
运行Pro/E
打开uitilities下拉菜单,点击辅助应用程序
作者: TOOL    时间: 2003-6-24 08:09
注册:
作者: TOOL    时间: 2003-6-24 08:11
start运行程序:
添加的菜单为:
作者: TOOL    时间: 2003-6-24 08:14
现在为Menu1-1添加动作
显示一个消息对话框,
先编写调用函数:
作者: TOOL    时间: 2003-6-24 08:16
在Menu动作中调用
作者: TOOL    时间: 2003-6-24 08:18
同样的编译调试-注册-运行之后
点击Menu1-1菜单出现:
作者: TOOL    时间: 2003-6-24 08:24
我写的有点细,不过觉得对初学是应该有很大帮助
我当时要是有人指导就好了,休息一下继续:)
作者: zzabccn    时间: 2003-6-24 08:25
status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)TestAccessDefault,  
     uiCmdPrioDefault, TestAccessDefault, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
   -1菜单Menu2动作  
如何在这里弹出vc对话框?
期待回复.
对不起,发贴的时候,没年看到前面.
作者: zine    时间: 2003-6-24 08:39
Yeah!  
不知道mf要自己写,而且要和程序对上,一个字也不能马虎,太感谢了!
//bow
作者: weijians    时间: 2003-6-24 08:50
恩,TOOL写的非常好!支持!!TOOL推荐你当斑竹吧!
作者: TOOL    时间: 2003-6-24 09:02
对话框:
在proe下面加弹出对话框我知道有两种  
  一种是用proe自带的对话框,在编对话框的时候没有vc里面那么容易,也没有那么直观  
要写一个.res的文件保存在text文件夹下面。在编辑的程序中调用对话框。编辑对话框 控件的时候 可以借助pro_dialog_view来查看编辑的对话框样式 具体看protoolkit user guide的UI那一章  
第二种就是vc的对话框,如果vc程序已经和proe接上去了,比如添加菜单了。就很容易 就在vc里面调用 对话框,和vc编程一样。平时多数使用vc对话框。  
  
不过简单的对话框也可以用proe二次开发做。其样式和proe一致
作者: TOOL    时间: 2003-6-24 09:20
下面为Pro/E风格对话框的添加:
作者: TOOL    时间: 2003-6-24 09:27
到此,pro/e的开发已经算人门了
不在详细介绍
pro/e对话框风格在user guide有:
作者: TOOL    时间: 2003-6-24 09:28
编写调用程序:
作者: TOOL    时间: 2003-6-24 09:29
/*-----------------------------------------------------------------*\
      确认对话框添加程序(Pro/E 风格对话框)
\*-----------------------------------------------------------------*/
int UsrConfirmAction(char *question,ProBoolean *confirm);
  int UsrExample()
  {
   &nbsproBoolean confirm;
    UsrConfirmAction("ro/E Dialog by TOOL", [$confirm)]
  return(1);
  }
/*====================================================================*\
  FUNCTION : UsrOKAction() PURPOSE  : Action function for the OK button
\*====================================================================*/
  void UsrOKAction(
     char *dialog,
     char *component,
    &nbsproAppData data)
  {
    &nbsproUIDialogExit(dialog, OK);
  }
/*====================================================================*\
  FUNCTION : UsrCancelAction()  
 &nbspURPOSE  : Action function for the Cancel button
\*====================================================================*/
  void UsrCancelAction(
     char *dialog,
     char *component,
    &nbsproAppData data)
  {
    &nbsproUIDialogExit(dialog, CANCEL);
  }
/*====================================================================*\
  FUNCTION : UsrConfirmAction()  
 &nbspURPOSE  : Utility to prompt the user with  question, and OK and Cancel
             buttons.
\*====================================================================*/
  int UsrConfirmAction(
     char *question,
    &nbsproBoolean *confirm)
  {
    &nbsproLine wline;
     int status;
/*--------------------------------------------------------------------*\     
  Load the dialog from the resource file
\*--------------------------------------------------------------------*/     
  ProUIDialogCreate("confirm","confirm");
/*--------------------------------------------------------------------*\     
  Set the OK and Cancel button actions
\*--------------------------------------------------------------------*/     
  ProUIPushbuttonActivateActionSet("confirm","OK",UsrOKAction, NULL);
  ProUIPushbuttonActivateActionSet("confirm","Cancel",UsrCancelAction,NULL);
/*--------------------------------------------------------------------*\     
  Set the Question test in the label
\*--------------------------------------------------------------------*/     
  ProStringToWstring(wline, question);
     ProUILabelTextSet("confirm","Question",wline);
/*--------------------------------------------------------------------*\     
  Display and activate the dialog
\*--------------------------------------------------------------------*/     
  ProUIDialogActivate("confirm", [$status)]
/*--------------------------------------------------------------------*\     
  Set confirm according to which button was used to close the dialog
\*--------------------------------------------------------------------*/     
  *confirm = (status == OK) ? PRO_B_TRUE : PRO_B_FALSE;
/*--------------------------------------------------------------------*\     
  Remove the dialog from memory
\*--------------------------------------------------------------------*/     
  ProUIDialogDestroy("confirm");
    return(1);
  }
作者: TOOL    时间: 2003-6-24 09:29
添加相关头文件
作者: TOOL    时间: 2003-6-24 09:36
编写消息注册文件(重要):
作者: TOOL    时间: 2003-6-24 09:38
注册运行:
弹出确认对话框
作者: TOOL    时间: 2003-6-24 09:40
今日暂时到此
作者: zhuqihua    时间: 2003-6-24 09:46
两个字”历害“!
作者: zzabccn    时间: 2003-6-24 11:35
全部程序是不是这样子,放在.cpp中,编译出问题.请帮助
  
#include &ltroToolkit.h>  
#include &ltroMenu.h>  
#include &ltroMenuBar.h>  
#include &ltroUtil.h>
  
void Check()
{
  AfxMessageBox("haha");
}
  
/*====================================================================*\  
FUNCTION : user_initialize()  
PURPOSE : Pro/TOOLKIT程序的总入口,完成初始化工作  
\*====================================================================*/  
extern "C" int user_initialize(  
    int argc,        
    char *argv[],  
    char *version,  
    char *build,  
    wchar_t errbuf[80])
{  
  
 &nbsproError status;  
  uiCmdCmdId cmd_id;  
 &nbsproFileName mf;  
  
 &nbsproStringToWstring(mf,"usermsg.txt");  
   
  status = ProMenubarMenuAdd ("Menu0", "USER Menu0",  
        "Help", PRO_B_TRUE, mf);  
  // 0添加父菜单Menu0  
  
  status = ProMenubarmenuMenuAdd ("Menu0", "Menu1", "USER Menu1",  
     NULL, PRO_B_TRUE, mf);  
  添加弹出式菜单Menu1  
  
  status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)Check,  
    uiCmdPrioDefault, Check, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
  -1菜单Menu2动作  
  
  status = ProMenubarmenuPushbuttonAdd ("Menu1", "Menu2",  
     "USER Menu2", "USER Menu2 help", NULL, PRO_B_TRUE,cmd_id, mf);  
  -1添加菜单Menu2  
   
  return 0;  
}
  
extern "C" user_terminater()
{
  return 0;
}
作者: zzabccn    时间: 2003-6-24 11:36
--------------------Configuration: testdlg1 - Win32 Debug--------------------
Compiling...
proe_main.cpp
f:\proecpp\testdlg1\proe_main.cpp(9) : error C2065: 'AfxMessageBox' : undeclared identifier
f:\proecpp\testdlg1\proe_main.cpp(42) : error C2664: 'ProCmdActionAdd' : cannot convert parameter 4 from 'void (void)' to 'uiCmdAccessState (__cdecl *)(uiCmdAccessMode)'
        None of the functions with this name in scope match the target type
Error executing cl.exe.
  
proe_main.obj - 2 error(s), 0 warning(s)
作者: TOOL    时间: 2003-6-24 11:37
没错,这样比较直接,不用两个动态库调用
作者: TOOL    时间: 2003-6-24 11:39
原来的内容不用删除,在toolkit.cpp上直接添加就可以了
作者: zzabccn    时间: 2003-6-24 12:42
编译通不过,可能漏了头.
作者: zine    时间: 2003-6-24 15:21
TOOL wrote:
编写消息注册文件(重要):

  
呵呵,我已经弄出来了,
  
可是怎么这样呢???
(我找不到OK和cancel的define,就换成PRO_TK_NO_ERROR和PRO_TK_GENERAL_ERROR了,呵呵)
作者: zzabccn    时间: 2003-6-24 15:51
//注意,上面多了一块蛋糕
k u ,TOOL.
//哈哈,完整程序是这样的.
// testdlg3.cpp : Defines the initialization routines for the DLL.
//
  
#include "stdafx.h"
#include "testdlg3.h"
  
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
  
//
//  Note!
//
//    If this DLL is dynamically linked against the MFC
//    DLLs, any functions exported from this DLL which
//    call into MFC must have the AFX_MANAGE_STATE macro
//    added at the very beginning of the function.
//
//    For example:
//
//    extern "C" BOOL PASCAL EXPORT ExportedFunction()
//    {
//      AFX_MANAGE_STATE(AfxGetStaticModuleState());
//      // normal function body here
//    }
//
//    It is very important that this macro appear in each
//    function, prior to any calls into MFC.  This means that
//    it must appear as the first statement within the  
//    function, even before any object variable declarations
//    as their constructors may generate calls into the MFC
//    DLL.
//
//    Please see MFC Technical Notes 33 and 58 for additional
//    details.
//
  
/////////////////////////////////////////////////////////////////////////////
// CTestdlg3App
  
BEGIN_MESSAGE_MAP(CTestdlg3App, CWinApp)
   //{{AFX_MSG_MAP(CTestdlg3App)
     // NOTE - the ClassWizard will add and remove mapping macros here.
     //    DO NOT EDIT what you see in these blocks of generated code!
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()
  
/////////////////////////////////////////////////////////////////////////////
// CTestdlg3App construction
  
CTestdlg3AppTestdlg3App()
{
   // TODO: add construction code here,
   // Place all significant initialization in InitInstance
}
  
/////////////////////////////////////////////////////////////////////////////
// The one and only CTestdlg3App object
  
CTestdlg3App theApp;
  
#include &ltroToolkit.h>  
#include &ltroMenu.h>  
#include &ltroMenuBar.h>  
#include &ltroUtil.h>
  
static uiCmdAccessState TestAccessDefault(uiCmdAccessMode access_mode)
{
     return (ACCESS_AVAILABLE);
}
  
void Check()
{
   AfxMessageBox("haha");
}
  
/*====================================================================*\  
FUNCTION : user_initialize()  
PURPOSE : Pro/TOOLKIT程序的总入口,完成初始化工作  
\*====================================================================*/  
extern "C" int user_initialize(  
     int argc,        
     char *argv[],  
     char *version,  
     char *build,  
     wchar_t errbuf[80])
{  
  
   ProError status;  
   uiCmdCmdId cmd_id;  
   ProFileName mf;  
  
   ProStringToWstring(mf,"usermsg.txt");  
     
   status = ProMenubarMenuAdd ("Menu0", "USER Menu0",  
         "Help", PRO_B_TRUE, mf);  
   // 0添加父菜单Menu0  
  
   status = ProMenubarmenuMenuAdd ("Menu0", "Menu1", "USER Menu1",  
      NULL, PRO_B_TRUE, mf);  
   添加弹出式菜单Menu1  
  
  // status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)Check,  
   //  uiCmdPrioDefault, Check, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
   -1菜单Menu2动作
   
   status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)Check,  
     uiCmdPrioDefault, TestAccessDefault, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
   -1菜单Menu2动作  
  
   status = ProMenubarmenuPushbuttonAdd ("Menu1", "Menu2",  
      "USER Menu2", "USER Menu2 help", NULL, PRO_B_TRUE,cmd_id, mf);  
   -1添加菜单Menu2  
     
   return 0;  
}
extern "C" void user_terminate()
{
  
}
作者: weijians    时间: 2003-6-24 16:09
请问zzabccn :添加之后,还要不要做其他的阿,我添加之后照你的做,编译怎么出现了许多错误阿??能不能再解释一下?
作者: TOOL    时间: 2003-6-24 17:39
zine wrote:
   
   
  怎么注册这个东东???  
   
  呵呵,我已经弄出来了,  
   
  可是怎么这样呢???  
  (我找不到OK和cancel的define,就换成PRO_TK_NO_ERROR和PRO_TK_GENERAL_ERROR了,呵呵)

  
对话框注册文件和菜单消息文件类似,存为.res格式,程序中调用
作者: zzabccn    时间: 2003-6-24 17:55
weijians wrote:
请问zzabccn :添加之后,还要不要做其他的阿,我添加之后照你的做,编译怎么出现了许多错误阿??能不能再解释一下?

我上面的程序工程名是:testdlg3
把这段加在主cpp文件后面即可,
  
#include &ltroToolkit.h>  
#include &ltroMenu.h>  
#include &ltroMenuBar.h>  
#include &ltroUtil.h>  
  
static uiCmdAccessState TestAccessDefault(uiCmdAccessMode access_mode)  
{  
    return (ACCESS_AVAILABLE);  
}  
  
void Check()  
{  
  AfxMessageBox("haha");  
}  
  
/*====================================================================*\  
FUNCTION : user_initialize()  
PURPOSE : Pro/TOOLKIT程序的总入口,完成初始化工作  
\*====================================================================*/  
extern "C" int user_initialize(  
    int argc,  
    char *argv[],  
    char *version,  
    char *build,  
    wchar_t errbuf[80])  
{  
  
 &nbsproError status;  
  uiCmdCmdId cmd_id;  
 &nbsproFileName mf;  
  
 &nbsproStringToWstring(mf,"usermsg.txt");  
    
  status = ProMenubarMenuAdd ("Menu0", "USER Menu0",  
        "Help", PRO_B_TRUE, mf);  
  // 0添加父菜单Menu0  
  
  status = ProMenubarmenuMenuAdd ("Menu0", "Menu1", "USER Menu1",  
     NULL, PRO_B_TRUE, mf);  
  添加弹出式菜单Menu1  
  
// status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)Check,  
  // uiCmdPrioDefault, Check, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
  -1菜单Menu2动作  
   
  status = ProCmdActionAdd("Menu2", (uiCmdCmdActFn)Check,  
    uiCmdPrioDefault, TestAccessDefault, PRO_B_TRUE, PRO_B_TRUE, [$cmd_id)]  
  -1菜单Menu2动作  
  
  status = ProMenubarmenuPushbuttonAdd ("Menu1", "Menu2",  
     "USER Menu2", "USER Menu2 help", NULL, PRO_B_TRUE,cmd_id, mf);  
  -1添加菜单Menu2  
    
  return 0;  
}  
extern "C" void user_terminate()  
{  
  
}
作者: zzabccn    时间: 2003-6-24 18:03
设置这个
作者: zzabccn    时间: 2003-6-24 18:05
还有这里
作者: Superuser    时间: 2003-6-24 19:59
程序在pro/e中提示注册成功,正在运行
可菜单却没有加载,什么都没有,怎么回事
  
好像应该有*.aux菜单文件吧,是不是这样
作者: TOOL    时间: 2003-6-24 20:10
*.aux是在菜单管理器上注册用的,这里的菜单用菜单文件usermsg.txt就可以了
作者: Superuser    时间: 2003-6-24 20:45
菜单没有加载怎么回事呢
protk.dat是这样的
  
name TOOl example
exec_file D:\cpp\tookit\Debug\tookit.dll
text_dir  D:\cpp\tookit
STARTUP  dll
revision 2001
allow_stop TRUE
end
作者: TOOL    时间: 2003-6-24 20:46
Superuser wrote:
菜单没有加载怎么回事呢  
  protk.dat是这样的  
  
  name TOOl example  
  exec_file D:\cpp\tookit\Debug\tookit.dll  
  text_dir  D:\cpp\tookit  
  STARTUP  dll  
  revision 2001  
  allow_stop TRUE  
  end

  
把菜单消息txt放到text_dir  D:\cpp\tookit  这下面
作者: Superuser    时间: 2003-6-24 20:53
没错,就放在这个目录下了
  
我的是中文版,会不会跟这个有关
作者: TOOL    时间: 2003-6-24 21:01
我不用中文,不太清楚,应该都可以的
确实不知你的错误了,我得步骤已经非常细了:)
看看其他有没有人能解答
作者: Superuser    时间: 2003-6-24 21:16
好,谢谢
作者: zzabccn    时间: 2003-6-25 07:54
增加一个text目录试下.
作者: zine    时间: 2003-6-25 09:22
superuser:
没错,就放在这个目录下了  
  
我的是中文版,会不会跟这个有关  
  
TOOL wrote:
我不用中文,不太清楚,应该都可以的  
  确实不知你的错误了,我得步骤已经非常细了:)  
  看看其他有没有人能解答

  
如果目录没错,Tool的例子是应该好用的。
不是中文版问题(我用both和仅中文都试验啦,呵呵),
  
不过如果你自定义了菜单,就要非常注意对应关系(包括大小写):
C函数里面的label项对应usermsg.txt的标题,程序运行时菜单显示内容是在usermsg.txt指定的对应内容。
  
我的例子:
USER Menu0
  PDCBit Design
#
#
USER Menu1
  Part Design
#
#
USER Menu11
  JieTou Design
#
#
USER Menu11 help
Start the JieTou Part Generation Program...
#
#
USER Menu12
  Mo Ju  Design
#
#
USER Menu12 help
Start the MoJu Part Generation Program...
#
#
USER Menu2
  Assembly Design
#
#
USER Menu21
  JieTou Assembly Design
#
#
USER Menu21 help
Start the JieTou Assembly Generation Program...
#
#
  
上述文本不可以乱留空行,Menu??  help 指的是状态栏显示的帮助信息。
// 请发扬 “严细认真“的大庆精神,^_^
  
//大家好,才是真的好。。。。。我在这里得到的帮助多多。。。
作者: weijians    时间: 2003-6-25 09:38
谢谢zzabccn,但加了之后还是一样,奇怪的是,怎么会出现许多头文件的错误。55555555--------------------Configuration: Toolkit2 - Win32 Debug--------------------
Compiling...
Toolkit2.cpp
e:\...\protoolkit\includes\promenu.h(53) : error C2065: 'uiCmdCmdId' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(53) : error C2146: syntax error : missing ';' before identifier 'cmd_id'
e:\..\protoolkit\includes\promenu.h(53) : error C2065: 'cmd_id' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(55) : error C2065: 'ProStringToWstring' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(56) : error C2065: 'ProMenubarMenuAdd' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(56) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\promenu.h(57) : error C2065: 'ProMenubarmenuMenuAdd' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(57) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\01.06.03.ptc_pro_engineer_2001_datecode_2002480_for_nt_iso-lnd\aaa\protoolkit\includes\promenu.h(58) : error C2065: 'ProCmdActionAdd' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(58) : error C2065: 'uiCmdCmdActFn' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(58) : error C2146: syntax error : missing ')' before identifier 'TestAccessDefault'
e:\..\protoolkit\includes\promenu.h(58) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\promenu.h(58) : error C2059: syntax error : ')'
e:\..\protoolkit\includes\promenu.h(59) : error C2065: 'ProMenubarmenuPushbuttonAdd' : undeclared identifier
e:\..\protoolkit\includes\promenu.h(59) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\prouicmd.h(135) : error C2378: 'uiCmdCmdId' : redefinition; symbol cannot be overloaded with a typedef
e:\..\protoolkit\includes\prouicmd.h(142) : error C2146: syntax error : missing ')' before identifier 'command'
e:\..\protoolkit\includes\prouicmd.h(142) : error C2378: 'uiCmdCmdActFn' : redefinition; symbol cannot be overloaded with a typedef
e:\..\protoolkit\includes\prouicmd.h(142) : error C2071: 'uiCmdCmdActFn' : illegal storage class
e:\..\protoolkit\includes\prouicmd.h(144) : error C2059: syntax error : ')'
e:\..\protoolkit\includes\prouicmd.h(175) : error C2146: syntax error : missing ')' before identifier 'command'
e:\..\protoolkit\includes\prouicmd.h(175) : error C2071: 'uiCmdCmdValFn' : illegal storage class
e:\..\protoolkit\includes\prouicmd.h(176) : error C2059: syntax error : ')'
e:\..\protoolkit\includes\prouicmd.h(203) : error C2146: syntax error : missing ')' before identifier 'command'
e:\.\protoolkit\includes\prouicmd.h(203) : error C2071: 'uiCmdCmdBktFn' : illegal storage class
e:\..\protoolkit\includes\prouicmd.h(206) : error C2059: syntax error : ')'
e:\..\protoolkit\includes\promenubar.h(45) : error C2061: syntax error : identifier 'uiCmdCmdActFn'
e:\..\protoolkit\includes\promenubar.h(50) : error C2373: 'ProCmdActionAdd' : redefinition; different type modifiers
e:\..\protoolkit\includes\promenubar.h(85) : error C2061: syntax error : identifier 'uiCmdCmdActFn'
e:\..\protoolkit\includes\promenubar.h(129) : error C2146: syntax error : missing ')' before identifier 'cmd_id'
e:\..\protoolkit\includes\promenubar.h(129) : error C2440: 'initializing' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\promenubar.h(132) : error C2059: syntax error : ')'
e:\01.06.03.ptc_pro_engineer_2001_datecode_2002480_for_nt_iso-lnd\aaa\protoolkit\includes\promenubar.h(158) : error C2061: syntax error : identifier 'uiCmdCmdId'
e:\..\protoolkit\includes\promenubar.h(174) : error C2146: syntax error : missing ')' before identifier 'cmd_id'
e:\..\protoolkit\includes\promenubar.h(174) : error C2440: 'initializing' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\promenubar.h(176) : error C2059: syntax error : ')'
e:\..\protoolkit\includes\promenubar.h(196) : error C2146: syntax error : missing ')' before identifier 'cmd_id'
e:\..\protoolkit\includes\promenubar.h(196) : error C2440: 'initializing' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
e:\..\protoolkit\includes\promenubar.h(197) : error C2059: syntax error : ')'
e:\01.06.03.ptc_pro_engineer_2001_datecode_2002480_for_nt_iso-lnd\aaa\protoolkit\includes\promenubar.h(219) : error C2373: 'ProMenubarMenuAdd' : redefinition; different type modifiers
e:\..\protoolkit\includes\promenubar.h(252) : error C2373: 'ProMenubarmenuMenuAdd' : redefinition; different type modifiers
e:\..\protoolkit\includes\promenubar.h(285) : error C2061: syntax error : identifier 'uiCmdCmdId'
e:\..\protoolkit\includes\promenubar.h(286) : error C2373: 'ProMenubarmenuPushbuttonAdd' : redefinition; different type modifiers
e:\..\protoolkit\includes\promenubar.h(332) : error C2061: syntax error : identifier 'uiCmdCmdId'
e:\..\protoolkit\includes\promenubar.h(425) : error C2061: syntax error : identifier 'uiCmdCmdId'
e:\..\protoolkit\includes\proutil.h(431) : error C2373: 'ProStringToWstring' : redefinition; different type modifiers
E:\联合测试\Toolkit2\Toolkit2.cpp(91) : error C2146: syntax error : missing ';' before identifier 'cmd_id'
E:\联合测试\Toolkit2\Toolkit2.cpp(97) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
E:\联合测试\Toolkit2\Toolkit2.cpp(101) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
E:\联合测试\Toolkit2\Toolkit2.cpp(108) : error C2146: syntax error : missing ')' before identifier 'Check'
E:\联合测试\Toolkit2\Toolkit2.cpp(108) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
E:\联合测试\Toolkit2\Toolkit2.cpp(109) : error C2059: syntax error : ')'
E:\联合测试\Toolkit2\Toolkit2.cpp(113) : error C2440: '=' : cannot convert from 'int' to 'enum ProErrors'
        Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
E:\联合测试\Toolkit2\Toolkit2.cpp(119) : error C2084: function 'void __cdecl user_terminate(void)' already has a body
E:\联合测试\Toolkit2\Toolkit2.cpp(119) : error C2732: linkage specification contradicts earlier specification for 'user_terminate'
        E:\联合测试\Toolkit2\Toolkit2.cpp(118) : see declaration of 'user_terminate'
Error executing cl.exe.
  
Toolkit2.dll - 55 error(s), 0 warning(s)
作者: Superuser    时间: 2003-6-25 11:29
可以了,谢谢各位
一个字 牛
作者: zine    时间: 2003-6-26 08:41
TOOL wrote:
添加相关头文件

  
请问Tool等:做ProE的对话框具体需要添加哪些头文件,
我总是找不到OK和CANCEL的定义,找遍了都,后来自己定义了一个,
可是我的对话框不是OK和CANCEL,而是Yes,No的,并且不工作(退不出),我上上一篇回复本帖有图。
作者: TOOL    时间: 2003-6-26 08:51
ok
cancle
自定义
#define ……
作者: zine    时间: 2003-6-26 11:00
多看User'sGuid 会有帮助??!!%……¥%×%※
这个confirm 对话框的.res 文件,要用proe 安装点\text\resource 下的confirm.res 才会好用(也就是指定的question会出来),
User'sGuid 的example 7 (Tool给的)那个好像不行(可是Tool有截图啊,呵呵??……%×※……),
  
confirm.res 要放到 text\resource  目录下,,,哎,看了才知道。
可是我的对话框怎么不退出呀,yes no都没反映,也不下去。
  
¥%※…………※×(※()我晕啦,,,,
研究中。。。。
作者: TOOL    时间: 2003-6-26 11:33
就是参考user guide里面的example
再找找原因,可以的
confirm.res 要放到 text\resource 目录下
这个确实很重要
和菜单资源文件一样
作者: zine    时间: 2003-6-26 13:33
汇报工作:这次真的好用了,留给后来人参阅吧,再次感谢TOOL
我的confirm.res:
  
(Dialog confirm
     (Components
         (PushButton                     OK)
         (PushButton                     Cancel)
         (Label                          msg)
         (Separator                      Separator1)
      )
   
     (Resources
         (OK.Label                  "Yes")
         (OK.AttachTop              True)
         (OK.AttachBottom           True)
         (OK.TopOffset              10)
         (OK.BottomOffset           10)
         (Cancel.Label                   "NO")
         (Cancel.AttachTop               True)
         (Cancel.AttachBottom            True)
         (Cancel.TopOffset               10)
         (Cancel.BottomOffset            10)
         (msg.Bitmap                     "UI question image")
         (msg.Label                      " Do you really love this forum? ")
         (msg.Columns                    10)
         (msg.AttachTop                  True)
         (msg.AttachBottom               True)
         (msg.TopOffset                  10)
         (msg.BottomOffset               10)
         (Separator1.AttachBottom        True)
         (Separator1.TopOffset           0)
         (Separator1.BottomOffset        0)
         (Separator1.LeftOffset          0)
         (Separator1.RightOffset         0)
         (.Label                         "CONFIRMATION")
         (.StartLocation                 5)
         (.DefaultButton                 "Yes")
         (.RememberSize                  False)
         (.Layout
             (Grid (Rows 1 1 0) (Cols 1)
                 msg
                 Separator1
                 (Grid (Rows 0) (Cols 1 1 1)
                     OK
                 (Pos 1 3)
                     Cancel
                  )
              )
          )
      )
)
作者: fanqm    时间: 2003-6-27 10:23
TOOL wrote:
添加链接库(非常重要的一步)

  
我按照你说的方法设置环境,但是出现以下问题(附图),请赐教!
作者: weijians    时间: 2003-6-30 09:24
我在做这个例子的时候,程序在VC上编译,连接都能通过,但在proe上注册运行时,再在VC上连接时出现 Linking...
LINK : fatal error LNK1104: cannot open file "Debug/Toolkit.dll"
Error executing link.exe.
一般是什么问题啊??急问!!!!!!!!!!!!!
作者: zine    时间: 2003-6-30 11:02
pro/e占用着吧?先关了pro/e,再编译。
每重新编译完,再重新注册时,都要重新打开pro/e的(第二次打开会快一些)。
TOOL告诉过我,否则还在内存中,看不到新的。
作者: weijians    时间: 2003-6-30 17:39
谢谢zine ,试过了也不是这个问题。
我都被它弄的心力憔悴了。
要么象这个例子老是在运行,其他能运行的就一闪而过,运行时把proe一起关了。唉,真绝望了。
作者: zine    时间: 2003-6-30 23:26
呵呵,怎么会这样,,
休息会,,,先查查病毒吧,最近病毒闹得挺厉害的。
作者: weijians    时间: 2003-7-1 10:29
谢谢zine ,刚才查毒了,也没病毒。
感觉什么倒霉事都碰到我了,一开始是编译程序的时候,好像系统的一些头文件出了问题,我就重装了一遍pro/e,头文件没问题了,却出现了这个问题。在重装之前还不会这样的,现在我又重装了好几遍proe还是这样。唉!!真的没办法了!真郁闷啊.......
  
  
作者: TOOL    时间: 2003-7-1 14:10
一般来说没有必要重装pro/e
作者: TOOL    时间: 2003-7-1 14:15
近日繁忙,本来想把mfc对话框的添加继续说下去,但是没有时间
过两天又要出去2个星期吧
回来我会在此贴补充上去的:)
作者: zine    时间: 2003-7-1 15:47
我等,,,,
我先看别的,就指望你了,
我真想请你喝酒,,喝喝。
作者: pengbof_lx    时间: 2003-7-5 10:28
Tool高手,我照着你的帖子做,结果开始不错,注册都成功了,程序也可以运行,就是菜单没有显示出来,估计是text文件夹里的文件(就是那个usermsg.txt等文件)有问题,想请教一下,这个text文件夹里的东东应该是生成的,还是我们自己编写。如果是生成的,怎么生成,在哪能找到;如果是自己写,怎么写;
作者: pengbof_lx    时间: 2003-7-5 10:28
Tool高手,我照着你的帖子做,结果开始不错,注册都成功了,程序也可以运行,就是菜单没有显示出来,估计是text文件夹里的文件(就是那个usermsg.txt等文件)有问题,想请教一下,这个text文件夹里的东东应该是生成的,还是我们自己编写。如果是生成的,怎么生成,在哪能找到;如果是自己写,怎么写;
作者: pengbof_lx    时间: 2003-7-5 10:28
不好意思,太心急了,多按了两下,就多发了两次:)
作者: TOOL    时间: 2003-7-5 10:34
text文件需要自己编写,可以参考我得.txt文件截图
作者: pengbof_lx    时间: 2003-7-8 14:54
搞定了,谢谢
作者: fanqm    时间: 2003-7-11 23:25
TOOL:
       程序编译链接都通过了,但是在Proe中运行时会突然退出。这是什么原因?
作者: great    时间: 2003-7-18 22:30
以我的经验,如果Pro/E没有任何警告的退出,往往是你编的程序里有指针没有正确释放。
作者: zine    时间: 2003-7-25 16:06
Toool等大侠:
快讲讲怎么建立和part件尺寸的联系吧,我要在对话框的面板上改所有的尺寸, 我都被那些函数闹死了。用户指南看得晕头转向。。
作者: lxf999999    时间: 2003-8-2 16:24
我想知道,有时候我的,程序无法从pro/e中推出去,他也不显示在,register也没哟,可是要是重新启动,proe时,他有没有了,
  
还有一个问题,有一个dll它总是在我启动proe时出现???
  
叮,不知该怎么做!!!???
作者: qpzmqpzm    时间: 2003-8-2 17:42
我也是按上面的步骤来的,可就是不能在proe下加载成功,我感觉可能是程序编译dll过程中的设置有问题,能生成dl,但可能不合法,真是急!!
tool你能再说说这句话么  “再此TOOLKIT程序和VC的交互无需使用动态库调用(编写两个动态库) ”我刚开始搞这个,感觉太难了。
我做这个程序的步骤是:
先建立一个dll,
然后添加一个空的c++程序在里面写上你的程序
  
按你的提示设置了vc环境,
能编译生成dll
  
不知哪里出了问题,请各位高手指点一下
在此,先谢谢各位了!
作者: TOOL    时间: 2003-8-4 11:08
qpzmqpzm wrote:
我也是按上面的步骤来的,可就是不能在proe下加载成功,我感觉可能是程序编译dll过程中的设置有问题,能生成dl,但可能不合法,真是急!!  
  tool你能再说说这句话么  “再此TOOLKIT程序和VC的交互无需使用动态库调用(编写两个动态库) ”我刚开始搞这个,感觉太难了。  
  我做这个程序的步骤是:  
  先建立一个dll,  
  然后添加一个空的c++程序在里面写上你的程序  
  
  按你的提示设置了vc环境,  
  能编译生成dll  
  
  不知哪里出了问题,请各位高手指点一下  
  在此,先谢谢各位了!

有可能是菜单文件出现问题了:)
作者: qpzmqpzm    时间: 2003-8-4 15:45
谢谢TOOL
现在可以了
作者: qpzmqpzm    时间: 2003-8-4 15:57
我对主菜单做了一些修改,每次加载都得手工操作,不知怎么做才能让自己的dll自动被proe自动调用,
作者: lxf999999    时间: 2003-8-22 11:44
qpzmqpzm wrote:
我对主菜单做了一些修改,每次加载都得手工操作,不知怎么做才能让自己的dll自动被proe自动调用,

我认为不可以
因为vc没有提供,PROE的菜单编辑器
每一次使用都要用不同的名字,在菜单编辑器的相同目录下!
还请高论!!
作者: midea2566    时间: 2003-8-26 14:17
您好,我是刚要学二次开发的同学,请问,我要准备一些什么知道呢?vc++及pro/e吗?达到什么程度?谢谢
作者: alanyx    时间: 2003-8-27 15:16
因为要做一个有关pro/e二次开发的课题,但是就目前而言,本人水平实在是太低,经朋友介绍来到这里,发现确实不错,谢谢你们!
作者: zzhtqe    时间: 2003-8-27 18:18
各位大侠,能不能弄个proe打开中文名prt文件的二次开发,要是能行那多好啊!
作者: zzabccn    时间: 2003-8-27 23:01
zzhtqe wrote:
各位大侠,能不能弄个proe打开中文名prt文件的二次开发,要是能行那多好啊!

肯定可以,稍过两三天给你做一个.
看下这两张图片:
作者: zzabccn    时间: 2003-8-27 23:01
2
作者: zzabccn    时间: 2003-8-28 14:42
中文名的prt会在asm,mfg中打不开.
作者: zzhtqe    时间: 2003-8-29 09:22
厉害,能不能教大家做呢?
作者: zzabccn    时间: 2003-8-29 11:37
zzhtqe wrote:
各位大侠,能不能弄个proe打开中文名prt文件的二次开发,要是能行那多好啊!

没有自动退出的问题了.
作者: zzabccn    时间: 2003-8-29 11:40
程序在这里
作者: zzhtqe    时间: 2003-8-29 19:23
按你的readme操作,只能打开prt文件,打开asm文件没有反应,打开drw文件就跳出pro关闭了.




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3