ug編程開發入門

1、UG/OPEN 是一系列UG開發工具的總稱。它們隨UG一起發佈,以開放性架構面向不同的軟件平臺提供靈活的開發支持。它使第三軟件商和UG用戶能在其提供的平臺上開發出適合自己需要的CAD產品。

UG/Open 套件組成:API, Grip, Menus cript ,UIStyler。

API:

UG/Open API也稱User Function,通過它可以在C程序和C++程序中以庫函數的形式調用UG內部的近2000個操作。

Grip語言:

GRIP(Graphics Interactive Programming)是一種專用的圖形交互編程語言,開發者可以用GRIP編程的方法自動實現在UG下進行的絕大部分操作。GRIP命令很像英語單詞,語法與BASIC 和FORTRAN相似,有某些情況下對於一些高級操作,用GRIP編程的方法比用UG交互的方法更有效,在UG交互環境下可以實現的功能用GRIP幾乎全都可以實現。UG提供了一個名叫UG Open GRIP的GRIP語言編輯器,用這個工具可以編輯、修改、編譯、連接程序。

Menus cript:

此項功能使用戶或第三方軟件商通過文本編輯器編輯UG菜單文件,以生成用戶化的菜單進而集成他們的特殊應用。UG/Open Menus cript支持UG主菜單和快速彈出式下拉菜單的修改,通過它可以改變UG菜單的佈局、添加新的菜單項以執行用戶二次開發程序、User Tools文件及操作系統命令等。UG/Open Menus cript的使用需專門授權。運用UG/OpenMenus cript可以完全改變UG軟件的主界面,需謹慎使用以防出現混亂。

UIStyler:

是用戶或第三方軟件商開發UG對話框的可視化工具,它比User Tools具有更強的功能。使用這個工具可以避免複雜的圖形用戶接口GUI(Graphics User Interface)編程。其設計的對話框的方式與Visual C++很相似。即利用對話框中基本控件的組合生成不同的對話框,對話框中所有控件都是實時可見的。

UG/Open 的主要功能實現就是利用UG/OPEN API,實質上就是UG提供的訪問UG內部對象或核心的一個函數庫。

UG/Open API(Application Programming Interface, 應用編程接口),使用戶可以使用標準的C語言編譯器,以習慣的格式編寫出面向UG的二次開發程序。此時可以充分地發揮C語言編譯和運行效率高,功能強大的特點。實踐證明,這些API函數也可以無縫地集成到C++程序中,並利用強大的Microsoft Visual C++ 集成環境進行編譯。這樣,我們就可以充分地發揮出VC強大的功能和極其豐富的資源,包括MFC類庫,使用面向對象的軟件工程方法,高效高質地進行軟件的開發。同時,也保證了對企業已有的各種源代碼資源(通常使用C語言編寫)的利用。

UG/Open API 函數能在兩種不同的環境下運行,根據編譯鏈接情況的不同,UG/Open API 二次開發程序又具有兩種形式:

a. 外部式(External):此時UG/Open API程序可以脫離UG環境,在操作系統下單獨運行,或者作為UG的一個子進程獨立運行。

特點:調用靈活,用途廣泛。

無法利用UG的交互界面。

b. 內部式(Internal):此時UG/Open API程序在UG環境下運行,與程序相關的各種事務通過UG代理執行。這樣做的一個好處是可執行程序更小,同時鏈接的速度也更快。另外,一旦程序被裝入,它將駐留在內存中,下次使用時不需重新加載,這樣也節省了時間。而且這種方式下用戶可與計算機交互,開發的程序能與UG無縫集成。

特點:直接控制UG的行為。

和用戶交互。

2、UG/Open++提供了一個面向對象的UG開發接口。使用這些接口可以通過C++類的層次關係訪問UG的對象和功能。這個類層次結構提供了許多功能,例如,創建,讀取,修改UG對象,以及控制UG軟件的運行。此外,通過繼承UG標準類,用戶可以定義自己的新類,從而拓展了原來的類層次結構。

UG/Open++實質上是在UG/Open基礎上,提供了C++開發接口。實際上,UG/Open++由兩個庫組成:Openpp庫提供了UG對象和功能;Vmathpp庫提供了一些通用的向量代數操作。但目前看來UG/OPEN++提供的功能實現起來過於繁瑣,許多功能還不完善,有待於進一步提高。

UG/Open++應用程序也可以分為內部應用程序和外部應用程序兩種。內部應用程序事實上是一個UNIX的共享庫或WINDOWS NT下的動態連接庫。內部應用程序必須運行在UG軟件中。外部應用程序是一個可以獨立執行的文件,無須UG軟件同時運行。

開發工具的安裝:

1、UG本身提供了UG/Open API、UG/OPEN GRIP的GRIP語言編輯器和UIStyler可視化開發工具,而UG/Open Menus cript的使用通過文本編輯器就可完成。

2、UG/OPEN 是在Microsoft Visual C++ 集成環境下開發編譯的,所以需要額外安裝Microsoft Visual C++。

如果先安裝VC,後安裝UG,則在VC新建工程選項裡會自動添加UG/OPEN AppWizard;否則,如果先安裝UG,再安裝VC則需手動將"

...UGS160UGOPEN"下的UgOpen.awx拷貝到"D:Microsoft Visual StudioCommonMSDev98BinIDE"下,在VC的IDE中添加UG/OPEN開發嚮導。

第一個UG/OPEN程序 "hello world"

第一步:

利用剛才教的方法,新建工程hello,進入如下界面。

第一個問題是要你確定建立程序的類型,是內部還是外掛式的,外掛式無法利用UG的交互界面;第二個問題是UG的版本;第三個是使用的語言,C或C++,USE/OPEN ++ CALLS意思是是否使用USE/OPEN++回調函數

第二步:

第一個問題確定激活應用程序的方法。

第二個是卸載程序的方法。

Finish,此時框架創建完成。生成hello.cpp和hellp.h兩個文件,還有ufsta( char *param, int *returnCode, int rlen )、ufusr_ask_unload( void )函數,還有一個PrintErrorMessage( int errorCode )錯誤處理函數。其中ufsta( )是UG的入口函數,主要工作在此完成。

下面簡單介紹一下程序

/*下面三個為UG/OPEN自己的頭文件,是最基本的頭文件,這個由嚮導自動添加,針對不同的開發,加入不同的頭文件,也就是不同的API 函數庫*/

#include

#include

#include

#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )

# include

using std::ostrstream;

using std::endl;

using std::ends;

#else

# include

#endif

#include

#include "hello.h"

extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )

{

/* Initialize the API environment */

int errorCode = UF_initialize(); /////初始化UG環境

if ( 0 == errorCode )

{

/* TODO: Add your application code here */

/*添加的UG OPEN API函數,也可在此添加自定義函數,然後在入口函數外定義,注意必須設定好VC中的開發環境,有關設定見附件*/

uc1601("hello world!",1);

/* Terminate the API environment */

errorCode = UF_terminate(); ////退出UG環境

}

/* Print out any error messages */

PrintErrorMessage( errorCode );

}

將程序編譯好,利用UG FILE->Execute UG/OPEN->user function,運行剛才編譯通過的DLL文件,就可看到結果了。

附件為開發環境設定和入門材料

涉及到UG開發問題的文件路徑有以下這些,大家可以根據裡面的內容好好熟悉一下:

1、ug open 庫文件及一些不錯的例子

UGS160\\\\ugopen

2、ug open puls puls 庫文件及例子

UGS160\\\\ugopenpp

3、UG系統設定

UGS160\\\\ugII

4、UG菜單和工具條

D:UGS160UGIImenus

5、存放開發程序

UGS160UGALLIANCE

6、UG OPEN開發文檔,內有較詳細的函數說明,是主要參考資料。

UGS160UGDOCHTML_FILES\\\\ugopen_doc

7、UG OPEN++開發文檔

UGS160UGDOCHTML_FILES\\\\ugopen++

8、UISTYLER開發文檔

UGS160UGDOCHTML_FILES\\\\uistyler.chm

下面講講如何用UISTYLER製作界面,以及如何提取和保存相應的數據~

如圖有如下界面~開發形式有些象VB或DEPHI,但比其煩瑣不方便,相對VC而言則較簡單~

如下圖的dialog是UG自帶的例子,在~UGS160UGOPEN下可找到~

關於控件的一些屬性,在這裡就不具體詳談了,大家可在UISTYLER開發文檔 (UGS160UGDOCHTML_FILES\\\\uistyler.chm )中找到詳細說明~唯一要提一點的是,並不是所有的屬性都是可以在程序中設定它的值的,也就是說有些屬性的值只能讀,不能寫~

我們主要介紹UISTYLER的屬性設定對話框~當選定如上圖界面2區域中最上面的dialog-demo時,3區域為三個page~為方便起見,只介紹比較重要的地方~

第一個page中"prefix name "為後面生成的所有控件的前綴,"launch dialog from "為對話框的加載方式;"Navigation Buttons"為對話框的樣式

第二個page控制能否進行選擇、選擇方式和選擇範圍;

第三個page為響應函數,其中constructor_cb為對話框的初始化函數,destructor_cb為對話框的卸載函數,有點類似C++中的構造函數和析構函數

當選定如上圖界面2區域中的一個控件時,區域3隨控件類型不同而變化~

attributes中的Identifier為唯一的標識符;Attachments控制控件與相鄰的上、左、右控件的位置關係;Callbacks為響應函數或回調函數,(注意:如果控件動作需要生成新的dialog,則將Create dialog選上,也可在程序中修改~)

將所有需要動作的控件回調函數或屬性設定好了後,特別是那些不能動態設定的完成後,保存,UG會生成*.dlg,*.c,*.h三個文件~其中後兩個是我們編程所需要的~

//////////////

#define 某類型控件變量 ("控件標識")

#define DEMO_SELECT_LABEL ("SELECT_LABEL")

#define DEMO_SEP_1 ("SEP_1")

、、、

、、、

////////下面為總控件數

#define DEMO_DIALOG_OBJECT_COUNT ( 18 )

//////下面為對話框的響應函數和回調函數聲明

int DEMO_constructor_cb ( int dialog_id,

void * client_data,

UF_STYLER_item_value_type_p_t callback_data);

、、、、

、、、、

現在用VC中的UG/OPEN AppWizard建立一個工程Test;將*.c和*.h包含到工程中,其中*.c為對話框的模版文件,也可直接copy到Test.cpp下~

1、首先介紹一下*.c中的關鍵內容

/*

響應函數總數,添加或刪除了函數時,注意要修改這個值

*/

#define DEMO_CB_COUNT ( 10 + 1 ) /* Add 1 for the terminator */

/*

函數聲明,注意如果想讓控件動作激活另一個dialog,則將第三個參數由"0"改為"1"

*/

static UF_STYLER_callback_info_t DEMO_cbs[DEMO_CB_COUNT] =

{

{UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, DEMO_constructor_cb},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB , 0, DEMO_destructor_cb},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, DEMO_ok_callback},

{UF_STYLER_DIALOG_INDEX, UF_STYLER_BACK_CB , 0, DEMO_back_cb},

{DEMO_FILTER_TOGGLE , UF_STYLER_VALUE_CHANGED_CB, 0, DEMO_filter_toggle_callback},

{DEMO_ADD_PUSH_BUTTON , UF_STYLER_ACTIVATE_CB , 0, DEMO_add_activate_cb},

{DEMO_NEXT_ACTION , UF_STYLER_ACTIVATE_CB , 0, DEMO_next_cb},

{DEMO_BUTTON_LAYOUT , UF_STYLER_ACTIVATE_CB , 0, DEMO_blo_6_act_cb},

{DEMO_EDGES_RADIO_BOX , UF_STYLER_VALUE_CHANGED_CB, 0, DEMO_edges_radio_vc_cb},

{DEMO_FIELDS_OPTIONS , UF_STYLER_ACTIVATE_CB , 0, DEMO_fields_options_act_cb},

{UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }

};

/*

加載dialog的兩種方式,剩下的就是具體的響應函數和回調函數的定義

*/

extern void ufsta (char *param, int *retcode, int rlen)

extern void (char *param, int *retcode, int rlen)

2、根據選擇的工程方式,添加creat dialog的函數

例如,可用

extern void (char *param, int *retcode, int rlen) 函數中的內容完全覆蓋

extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )中的內容,當然return就不要了,還有其他的函數變量聲明必須在入口函數前。

3、在消息響應函數中添加相應代碼,這是主要工作了,要熟悉ug open API才行~

4、最後將工程編譯,生成test.dll文件。將*.dlg拷貝到~UGS160UGALLIANCEsiteapplication下,然後打開UG,打開或新建文件後,用file->Execute UG/OPEN->user function調用test.dll,就可調入自己設定的對話框。

示例工程附件

UG16的版本,WIN2000的系統,VC6。0,不同版本可能要重新編譯一下

1、控件屬性的設定

UF_STYLER_item_value_type_t list_data; ////////聲明控件變量類型

char * strings[] = {"list item #1",

"list item #2",

"list item #3",

"list item #4"};

///////////下面語句的含義,是對item_id控件的item_attr屬性設定新數據,數據為string數組(以指針地址給出),4個字符串,控件所在dialog為dialog_id,最後用UF_STYLER_set_value ()設定。

list_data.item_id = DEMO_MULTI_LIST;

list_data.item_attr = UF_STYLER_SUBITEM_VALUES;

list_data.count = 4;

list_data.indicator = UF_STYLER_STRING_PTR_VALUE;

list_data.value.strings = strings;

if ( UF_CALL ( UF_STYLER_set_value ( dialog_id, &list_data ) ) )

{

return (UF_UI_CB_CONTINUE_DIALOG);

}

2、控件屬性的讀取

和上面類似,最後用UF_STYLER_ask_value()取出控件的某一屬性值或狀態

UF_STYLER_item_value_type_t sel_data;

/* Get the selection structure from the dialog.*/

sel_data.item_id = UF_STYLER_DIALOG_INDEX;

sel_data.item_attr = UF_STYLER_SELECTION;

if ( UF_CALL ( UF_STYLER_ask_value( dialog_id, &sel_data ) ) )

{

return (UF_UI_CB_CONTINUE_DIALOG);

}

ug編程開發入門


分享到:


相關文章: