Pro/TOOLKIT

From GICL Wiki
Revision as of 17:35, 14 March 2007 by D Wilkie (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

I'm using Pro/ENIGNEER Wildfire 3 and Visual Studio .Net 2003.

Contents

Installation

Pro/TOOLKIT is sold as a component of Pro/ENGINEER. If your license allows, you can install Pro/TOOLKIT along with Pro/ENGINEER. There should be an option during the Define Installation Components section of the install with something like:

API Toolkits—Select this component to optionally install the files necessary to run the Application Program Interface toolkits like Pro/J.Link, Pro/Web.Link, and Pro/TOOLKIT.

Setting Up A Project

I found a tutorial on setting up a visual studio project at [1]. I used Visual Studio .Net 2003 and had no problems.

Hello World

The simplest method for a "HelloWorld" program is likely the following:

   ProStringToWstring (UserMsg, "C:\\cygwin\\home\\Admin\\tkTest\\TKTEMPLATE\\msg_user.txt");
   ProMessageDisplay (UserMsg, "USER %0s", 
       "Hello World.");

where msg_user.txt has the following:

USER %0s  
%0s  
#
#
USER -HelloWorld	
HelloWorld
#
#
USER -MainBtn1
-MainBtn1
#
#
USER New Button help.
New Button help.
#
#
USER -Sub1
-Sub1
#
#
USER -Sub1Btn1
-Sub1Btn1
#
#
USER -Sub1Btn2
-Sub1Btn2
#
#

The path will obviously have to be changed to wherever you keep the file. These message files keep the text that is displayed in Pro/ENGINEER. A typical use will be something like the following:

   status = ProMenubarMenuAdd ("HelloWorld", "USER -HelloWorld", 
       "Utilities", PRO_B_TRUE, UserMsg);

Here, a button will recieve the text defined in the file under "USER -HelloWorld." In the above, this is HelloWorld. However, if the the text file instead had the entry

USER -HelloWorld	
Export

the button would be named "Export." A quirky feature of these message files is that changes in them will only be recognized once Pro/ENGINEER is closed down and restarted. Merely restarting the auxiliary application or re-registering it is insufficient.

Hello Button

The added functionality of some of the above code hints at what is to come here: a short talk on adding menus to Pro/E. This section is based on code from the user guide, which has had its buggy portions removed.

#include <time.h>
#ifdef USE_ANSI_IOSTREAMS
# include <iostream>
using namespace std;
#else
//# include <iostream.h>
#endif
#include "TestError.h"

/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#define PRO_USE_VAR_ARGS


#include <ProDrawing.h>
#include <ProMenuBar.h>
#include <ProMessage.h>

/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static wchar_t  MSGFIL[] = {'m','s','g','_','u','s','e','r','.','t','x','t','\0'};
static char revcode[PRO_LINE_SIZE];

/* Declare function */
ProError ProTestInstallationCheck();
ProError ProTestInstallationURLCheck();
ProError  ProTestDialogCreate ( ProBoolean is_successful );

extern "C" static uiCmdAccessState TestAccessDefault(uiCmdAccessMode access_mode)
{
    return (ACCESS_AVAILABLE);
}

/*================================================================*\
FUNCTION:  MiscAction()
PURPOSE:   Generic action function
\*================================================================*/
extern "C" int MiscAction()
{
	wchar_t UserMsg[80];
	ProStringToWstring (UserMsg, "C:\\cygwin\\home\\Admin\\tkTest\\TKTEMPLATE\\msg_user.txt");
    ProMessageDisplay (UserMsg, "USER %0s", "Action function called.");
    return (0);
}


/*===========================================================================*\
  Function : main
  Purpose  : Test the ProToolkitMain() function. main is optional function.
\*===========================================================================*/
int main(int argc, char **argv)
{
//    cerr << endl << "\tWelcome to Pro/TOOLKIT  -  The \"pt_install_test\" program" << endl;

    ProToolkitMain(argc, argv);

    return(0);
}


/*====================================================================*\
FUNCTION : user_initialize()
PURPOSE  : Pro/DEVELOP standard initialize - define menu button
\*====================================================================*/
extern "C" int user_initialize(
    int argc,			
    char *argv[],
    char *version, 
    char *build,
    wchar_t errbuf[80])
{
    char cbuff1[PRO_PATH_SIZE], cbuff2[PRO_PATH_SIZE];
    char astr1[PRO_LINE_SIZE];
    int i, menu_id;
    ProPath wbuff1, wbuff2;
    ProError status;
    uiCmdCmdId	cmd_id;
	wchar_t UserMsg[80];

/*================================================================*\
	Say hello and add menu buttons.
\*================================================================*/

/*----------------------------------------------------------------*\
    Message file.
\*----------------------------------------------------------------*/
    ProStringToWstring (UserMsg, "C:\\cygwin\\home\\Admin\\tkTest\\TKTEMPLATE\\msg_user.txt");
    ProMessageDisplay (UserMsg, "USER %0s",         "Apples2Apples export tool started.");

/*----------------------------------------------------------------*\
    Add a new menu to the menu bar (to the right of Utilities).
\*----------------------------------------------------------------*/
    status = ProMenubarMenuAdd ("Exporter", "USER -Exporter", 
        "Utilities", PRO_B_TRUE, UserMsg);
/*----------------------------------------------------------------*\
    Add to the new menu.
\*----------------------------------------------------------------*/
    status = ProCmdActionAdd ("UserDispMsg", (uiCmdCmdActFn)MiscAction,
        uiCmdPrioDefault, TestAccessDefault, PRO_B_TRUE, PRO_B_TRUE,
        &cmd_id);

    status = ProMenubarmenuMenuAdd ("Exporter", "Sub1", "USER -Sub1", 
        NULL, PRO_B_TRUE, UserMsg);
/*----------------------------------------------------------------*\
    Fill in the buttons of Sub1.
\*----------------------------------------------------------------*/
    status = ProMenubarmenuPushbuttonAdd ("Sub1", "Sub1Btn1",
        "USER -Sub1Btn1", "USER New Button help.", NULL, PRO_B_TRUE,
        cmd_id, UserMsg);


	return(0);
}

/*====================================================================*\
FUNCTION : user_terminate()
PURPOSE  : To handle any termination actions
\*====================================================================*/
extern "C" void user_terminate()
{
/*---------------------------------------------------------------------*\
   Loging file close. 
\*---------------------------------------------------------------------*/
    ProTestErrlogClose();

//    cout << "user_terminate" << endl;
}


  • ProMenubarMenuAdd - this creates a button on the highest level menu next to "Utilities," which is actually the Tools button...
  • ProMenubarmenuMenuAdd - this adds a menu to the menu that was added with ProMenubarMenuAdd.
  • ProMenubarmenuPushbuttonAdd - This adds a button off of the menu just added an associates with it the action created with ProCmdActionAdd.

Integration with other DLLs

The documentation for Pro/TOOLKIT in the windows environment is, as near as I can tell, virtually non-existent. The best documentation that I've been able to find is the website cited earlier. This site brings up a difficulty in integrating Pro/TOOLKIT with other libraries: modern dlls are often built with the a multi-threaded runtime library. In order to build a Pro/TOOLKIT dll with a multi-threaded runtime library, the following changes must be made to the set up sequence described in the cited site:

  1. Do not link to protk_dll.lib. Instead link to protk_dllmd.lib.
  2. Change the runtime library to Multi-threaded Debug DLL or the non-Debug version.
  3. If needed, explicitly include MSVCRTD.lib (debug) or MSVCRT.lib.

The project should now be able to be built and run from Pro/ENGINEER as well as integrated with existing dlls. [1] claimed that this library cannot be used to create a standalone executable.

Integrating with STD libraries

For some reason, I kept getting the following errors when I tried including iostream and string.

c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2039: 'fgetwc' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2039: 'fgetws' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2039: 'fputwc' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(20): error C2039: 'fputws' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(20): error C2039: 'fwprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2039: 'fwscanf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2039: 'getwc' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2039: 'getwchar' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(23): error C2039: 'putwc' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(23): error C2039: 'putwchar' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2039: 'swprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2039: 'swscanf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2039: 'ungetwc' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2039: 'vfwprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2039: 'vswprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2039: 'vwprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(26): error C2039: 'wprintf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(26): error C2039: 'wscanf' : is not a member of 'operator``global namespace'''
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2873: 'fgetwc' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2873: 'fgetws' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(19): error C2873: 'fputwc' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(20): error C2873: 'fputws' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(20): error C2873: 'fwprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2873: 'fwscanf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2873: 'getwc' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(21): error C2873: 'getwchar' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(23): error C2873: 'putwc' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(23): error C2873: 'putwchar' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2873: 'swprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2873: 'swscanf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(24): error C2873: 'ungetwc' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2873: 'vfwprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2873: 'vswprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(25): error C2873: 'vwprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(26): error C2873: 'wprintf' : symbol cannot be used in a using-declaration
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\cwchar(26): error C2873: 'wscanf' : symbol cannot be used in a using-declaration

My workaround was to write my own version of cwchar without the missing functions:

#include <wchar.h>
#define _CWCHAR_
namespace std {
using ::mbstate_t; using ::size_t; using ::wint_t;
using ::fwide; using ::mbrlen; using ::mbrtowc; 
using ::mbsinit; using ::wcrtomb; using ::wcsrtombs; 
using ::wcstol; using ::wcscat; using ::mbsrtowcs;
using ::wcschr; using ::wcscmp; using ::wcscoll;
using ::wcscpy; using ::wcscspn; using ::wcslen;
using ::wcsncat; using ::wcsncmp; using ::wcsncpy;
using ::wcspbrk; using ::wcsrchr; using ::wcsspn;
using ::wcsstr; using ::wcstok; using ::wcsxfrm;
using ::wmemchr; using ::wmemcmp; using ::wmemcpy;
using ::wmemmove; using ::wmemset; using ::wcsftime;
    };

This has allowed me to include iostream and string, and I've yet to run into a problem.

Links

1: http://www.caddigest.com/subjects/pro_engineer/select/tutorials/jovanovic_toolkit_environment.htm