|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一個應用程序接口(API),,其的編程語言是C 語言,它可以對Pro/ENGINEER進行功能擴展,滿足PTC客戶的特定需求。而且,,Pro/TOOLKIT提供了定制標準Pro/ENGINEER用戶界面的能力,自動執(zhí)行重復性的程序,通過Pro/ENGINEER集成的內部程序(Dll)或外部應用程序(Exe)可以為造型用戶提供自定義的應用程序、設計規(guī)劃和繪圖自動化,。
! k% M7 @% u; v* d2 n2 Pro/TOOLKIT編程條件和工具) X# X3 _5 S8 e+ j/ v
知道如何寫C程序,就已經具備了使用Pro/TOOLKIT的條件,,應該能夠理解指針,,當把數據從一個函數傳到另一函數時,將經常使用到它,。Pro/TOOLKIT幫助,,包含2000多個函數,并且可以通過例子代碼學習如何使用,。除此之外,,如果想解決幾何學問題,還需要對失量理論有一定的了解,。0 ?1 \+ L' Q8 h, g" e. g, B1 h
3 Pro/TOOLKIT程序中的結構體
! {; v( N0 X! z/ R# o0 z1 X9 M A( n Pro/TOOLKIT都是用C語言編寫的,,每個對象都用結構體來描述,因此需要了解對象是如何使用的,。為了使用結構體,,需要定義它,Pro/TOOLKIT提供許多“typedefs”,,這些typedefs只不過是Pro/ENGINEER結構體的偽指令,。例如:
. _+ f8 |, q0 B: Otypedef struct entity* ProPoint;& p }) V @3 m* t. W
typedef struct sld_part* ProSolid,;5 J9 e3 ^1 }4 m! |) \
這些也叫做OHandles (from Opaque handles),,在Pro/ENGINEER中它們直接獲得對象的內存地址。在某些情況下,,這樣做可能是危險的,,因此PTC提供了另外一種結構體類型,它只包含Pro/ENGINEER的內部數據庫中項目的必要信息,。這種結構體(labeled DHandle from data handle)是一種類的結構,,它包括對象的類型、ID等,。許多函數命令都和下面的結構體相聯系,。' ^0 m6 ^& ?/ {. v) a0 l
typedef struct pro_model_item
1 p* }' L* }) Q{
$ ]4 P2 } u8 o9 Y! d: c# [) X, `. ?! t& \ProType type;2 K/ y* p3 M5 ?# O$ X7 l
int id;
$ j, w( |& m O' q( D7 q* A" |ProMdl owner;
; U2 g& N+ D" [4 T2 X}ProModelitem,ProGeomitem,,ProExtobj,, ProFeature,ProProcstep,,ProSimprep,,ProExpldstate,
$ n3 m$ _# r2 {- HProLayer,ProDimension,,ProDtlnote,,ProDtlsyminst,ProGtol,,ProCompdisp : P" \/ h2 }. ~1 P! u: F& A9 i1 a
7 F, z- i1 V' b
如果處理幾何問題,,要用到ProModelitem、ProGeomitem 和ProFeature這幾個結構體,。
5 i$ L9 y; e; k5 c4 o4 Pro/TOOLKIT中的常用函數及使用
* f3 @% z/ B' y4 o1 s: r 需要了解的第一個函數是ProMdlCurrentGet()。在Pro/TOOLKIT幫助中其描述如下,。
8 A* q2 Y9 K8 z- ADescription9 d; K# d3 @* V$ J
Initializes the p_handle with the current Pro/ENGINEER object.
5 Q" ]' n# Y# F% D1 Z! RSynopsis+ l$ o F4 t" e3 a3 E3 Q* S
#include <ProMdl.h>, B& F$ o. U% \0 _8 y# q- n
ProError ProMdlCurrentGet (+ D+ L( S3 s# [ e+ O/ M: |- b
ProMdl *p_handle# [& w& E6 r2 f5 B: D/ ?& R9 E9 D* ?
/* (Out) , Z: ^* i% k6 x9 f8 |
The model handle+ c N# O1 e h* Q4 q! r
*/) ?! a- ?7 Q' |; m* m. l3 z7 b
)% ~2 ^9 E% u5 y, n7 P
這個函數包含一個參數-指針型參數,,定義及使用方法如下。/ D( ?2 ~6 N/ k
ProMdl mdlhandle;3 g p' K2 E/ d4 o: t
ProMdlCurrentGet(&mdlhandle);
7 c4 c% q9 [4 Tmdlhandle 是Ohandle型參數 ,,能用這個對象做許多事情,。例如,能用ProMdlDataGet()做一個調用并且獲得關于這個模型的一些初始信息,。
$ c0 O, E4 Z) k# I& \- b/ S+ PProMdldata mdldata;: y. `+ I3 A: _5 i6 v* h* i
ProMdlDataGet (mdlhandle,, &mdldata);4 o3 ]( I0 E0 \$ E8 c
mdldata是一個簡單的結構體,包括名稱,、類型,、路徑和關于模型的一些其他信息。下面打印這個模型的類型,。
8 F0 j6 Z; l P$ n( B' K% J* ~ 不能直接執(zhí)行printf("%s\n",,mdldata.type),需要采用下面的方式,,用ProWstringToString()把這種類型轉成一種規(guī)定的字符序列:
5 p* `& n8 K- R' t; Achar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
. ^6 H$ i# a* H/ u5 t: hProWstringToString (type_in_c,, mdldata.type);
& j- V0 s" s3 a* G( \printf("%s\n",type_in_c);( q$ k4 E: \ k: d: f2 r' W9 g* M# D
現在打印模型的名字,,就能象上面一樣,,從mdldata結構中取出名字,也可以用另一種的方法,。
) E/ J5 t8 g0 V, r2 i$ vProName current_name; l* C; l' w! T' v# [7 Q
char current_name_in_c[PRO_NAME_SIZE]; $ n8 z! y. T" s' o% w+ c
ProMdlNameGet(mdlhandle,, current_name);
2 d6 W% y) }: vProWstringToString(current_name_in_c,current_name);
3 n' I: z0 U3 ^$ N; e/ K- e' Vprintf("%s\n",, current_name_in_c);" i6 E) I$ Y& ~( Z: V
接著,,我們看一下訪問函數。模型可能有大量包含許多子對象的對象,。由于不知道這些對象的數量,,需要能夠以某種方式收集要尋找的對象。對于這種類型的問題,需要用到PTC提供的訪問函數,。
/ A( Y) l2 o0 N9 i1 Q 假設想訪問包含在一個模型中的所有特征并收集它們的ids,。執(zhí)行這個指令的函數是ProSolidFeatVisit()。其包括4個參數: ProSolid句柄,、訪問函數指針,、過濾函數指針和應用數據的結構體指針。過濾函數的目的是能夠過濾特定的對象,,請看下面的例子:
" @' c' i/ b; I: X# Estatic ProError user_action_get_feat_ids(
" {1 `! w4 V4 U0 ?ProFeature *feature,,
/ _' T( f( T( G3 y X% L1 o* k% J l1 A8 i; ^ProError status,
# O2 J+ F4 W% {' JProAppData appdata)! T G, \! S1 S4 r) p+ W! }' h
{, U0 z+ x% @0 n+ w) |5 P5 O4 Y
ProBoolean visible;
5 D% y) W' w' C9 k" N, ^7 Uvector<int> *fids = (vector<int> *)appdata;
5 b& H1 ]6 v0 ^, S' B5 K$ N0 bProFeatureVisibilityGet(feature,,&visible); /* only work with visible features */
3 U' \. d' u/ N+ e: ^if(visible == PRO_B_TRUE){ // and collect their ids
" c8 @) |$ X3 m! l- f% q0 d8 \fids->push_back(feature->id);
. M3 @; m B+ _$ X* I9 D} X f0 Y" s% Q# H
return(PRO_TK_NO_ERROR);
" q& K( \3 e9 L( t' f4 v }0 Z" n3 j# C5 C( Q8 N9 D
vector<int> feat_ids;
4 e' l1 i2 j0 }" v% I// the main Pro/TOOLKIT call8 r- z8 p1 t5 _; Y* e
ProSolidFeatVisit((ProSolid) mdlhandle,,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,,(ProAppData)&feat_ids) ,;注意前面提到的mdlhandle的使用,在函數調用中ProMdl 和 ProSolid能相互變換,。還要注意,,對于不想使用的過濾函數,賦該參數值為NULL,。" v/ f( N) Y- C/ f
現在在feat_ids中獲得一系列ids,,這樣就能使用它們執(zhí)行一些任務,例如把它們打印出來:
# \+ X: V! I9 b; E4 K( Sfor(unsigned int i=0; i<feat_ids.size(); i++){
: e: _9 s% r g( X& Vcout<<feat_ids<<endl;
0 `( H8 @9 `' b5 Y& r& f9 |}+ A0 \0 f: {' `! _7 a$ [. C! n
5 結束語
! s) y9 T2 H% a- P7 [ 以上提到的是需要學習Pro/TOOLKIT最基本,、最常用的概念,。建議學習這些例子時,可以不斷變化的進行實驗,。另外,,通過學習Pro/TOOLKIT幫助中的實例,不斷深入理解大量的函數,,學會其使用方法,,逐步開發(fā)出用戶需要的Pro/ENGINEER外掛模塊,以滿足特殊用戶的需求 |
|