|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一個(gè)應(yīng)用程序接口(API),,其的編程語(yǔ)言是C 語(yǔ)言,,它可以對(duì)Pro/ENGINEER進(jìn)行功能擴(kuò)展,,滿足PTC客戶的特定需求,。而且,,Pro/TOOLKIT提供了定制標(biāo)準(zhǔn)Pro/ENGINEER用戶界面的能力,,自動(dòng)執(zhí)行重復(fù)性的程序,通過Pro/ENGINEER集成的內(nèi)部程序(Dll)或外部應(yīng)用程序(Exe)可以為造型用戶提供自定義的應(yīng)用程序,、設(shè)計(jì)規(guī)劃和繪圖自動(dòng)化,。
, P' Q3 k# z, L% y2 P3 Z& w2 Pro/TOOLKIT編程條件和工具! b: B7 V* D' i3 u- N
知道如何寫C程序,,就已經(jīng)具備了使用Pro/TOOLKIT的條件,,應(yīng)該能夠理解指針,,當(dāng)把數(shù)據(jù)從一個(gè)函數(shù)傳到另一函數(shù)時(shí),將經(jīng)常使用到它,。Pro/TOOLKIT幫助,,包含2000多個(gè)函數(shù),并且可以通過例子代碼學(xué)習(xí)如何使用,。除此之外,,如果想解決幾何學(xué)問題,還需要對(duì)失量理論有一定的了解,。
1 M+ N& e! e' w3 Pro/TOOLKIT程序中的結(jié)構(gòu)體
+ ]$ Z4 E" ^- a: {5 g! O Pro/TOOLKIT都是用C語(yǔ)言編寫的,每個(gè)對(duì)象都用結(jié)構(gòu)體來描述,因此需要了解對(duì)象是如何使用的。為了使用結(jié)構(gòu)體,,需要定義它,Pro/TOOLKIT提供許多“typedefs”,,這些typedefs只不過是Pro/ENGINEER結(jié)構(gòu)體的偽指令。例如:
( q$ z D1 e( `! h1 a1 Atypedef struct entity* ProPoint;
: w! N. i5 o& k4 j) i- etypedef struct sld_part* ProSolid;% W$ ?# D& x4 i: c+ B9 K2 m1 _
這些也叫做OHandles (from Opaque handles),,在Pro/ENGINEER中它們直接獲得對(duì)象的內(nèi)存地址,。在某些情況下,,這樣做可能是危險(xiǎn)的,,因此PTC提供了另外一種結(jié)構(gòu)體類型,,它只包含Pro/ENGINEER的內(nèi)部數(shù)據(jù)庫(kù)中項(xiàng)目的必要信息,。這種結(jié)構(gòu)體(labeled DHandle from data handle)是一種類的結(jié)構(gòu),,它包括對(duì)象的類型、ID等,。許多函數(shù)命令都和下面的結(jié)構(gòu)體相聯(lián)系。. t% K: h C$ Q* w3 }; m; X
typedef struct pro_model_item
6 H6 e& |. I1 Q7 K& k0 r$ ]2 o+ q" J# |{
3 r, V# [8 L! Z4 O8 `; A9 C- XProType type;
1 P( p9 r9 ^, j' e# }8 |int id;' r8 i7 M+ K4 s# ]9 N8 r
ProMdl owner;
6 H6 e6 A# D) m% w}ProModelitem,ProGeomitem,ProExtobj,, ProFeature,ProProcstep,,ProSimprep,,ProExpldstate,9 j. W' ]8 ]% z, U) b
ProLayer,,ProDimension,ProDtlnote,,ProDtlsyminst,ProGtol,,ProCompdisp : v) R N* V2 ~& b" T
. l* Y' h. L4 t 如果處理幾何問題,,要用到ProModelitem,、ProGeomitem 和ProFeature這幾個(gè)結(jié)構(gòu)體,。
% [% W( n8 v4 `5 Q* B T4 Pro/TOOLKIT中的常用函數(shù)及使用
8 ^6 `9 @- g7 f+ e3 U 需要了解的第一個(gè)函數(shù)是ProMdlCurrentGet()。在Pro/TOOLKIT幫助中其描述如下。8 I ]3 K' J0 z8 h# O, ^. B. u) E5 [! W
Description
4 Z# Y* h7 y5 p5 r7 y ` D; R: BInitializes the p_handle with the current Pro/ENGINEER object.
+ c% \9 X; L. z' q+ }8 t- pSynopsis
; q8 V% V1 }* x K- x1 |#include <ProMdl.h>) ]5 B, D, z4 @. g" {' n* @
ProError ProMdlCurrentGet (
1 S" N/ c S; ?& ]ProMdl *p_handle
3 l# t0 U4 q/ F! }* l9 E3 b6 T8 v, l/* (Out) 5 }3 L# z( ^. k i# F9 |( R# X. b
The model handle
, |' D6 ?/ b% f0 @# n/ ?* r# p6 v*/
8 K/ j& M9 O. I U+ K& f7 _5 f! })" ^1 w+ D' ^ L0 ]8 _" W4 O: N
這個(gè)函數(shù)包含一個(gè)參數(shù)-指針型參數(shù),,定義及使用方法如下,。
9 }: {3 f/ k" P H9 E/ J3 z4 b O/ XProMdl mdlhandle;/ a: j" P2 p9 X1 ?8 V
ProMdlCurrentGet(&mdlhandle);
3 ?) z2 h+ i4 a2 V! \, i9 f! `mdlhandle 是Ohandle型參數(shù) ,,能用這個(gè)對(duì)象做許多事情,。例如,,能用ProMdlDataGet()做一個(gè)調(diào)用并且獲得關(guān)于這個(gè)模型的一些初始信息。
1 d6 _, v8 r3 m: q) IProMdldata mdldata;- T q* d/ V, Z5 ?7 a* c
ProMdlDataGet (mdlhandle,, &mdldata);
3 ?& |+ |* R9 P0 D+ M5 f; d, p* X mdldata是一個(gè)簡(jiǎn)單的結(jié)構(gòu)體,,包括名稱、類型,、路徑和關(guān)于模型的一些其他信息,。下面打印這個(gè)模型的類型。
" w! p) F0 k8 Y+ B2 L& { 不能直接執(zhí)行printf("%s\n",,mdldata.type),,需要采用下面的方式,用ProWstringToString()把這種類型轉(zhuǎn)成一種規(guī)定的字符序列:8 F- G9 d7 A4 X5 K- R0 w7 V
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
" p; G' g$ s, R! D) FProWstringToString (type_in_c,, mdldata.type);- a( g4 L& u( n! |
printf("%s\n",,type_in_c);3 O) @0 w( _6 D
現(xiàn)在打印模型的名字,就能象上面一樣,,從mdldata結(jié)構(gòu)中取出名字,,也可以用另一種的方法。) o; L9 [8 b u
ProName current_name;( Q8 u0 w8 r& f: @2 s" {" k& j5 g
char current_name_in_c[PRO_NAME_SIZE];
d! A$ i5 |' e) AProMdlNameGet(mdlhandle,, current_name);$ y) ~! \0 d7 F
ProWstringToString(current_name_in_c,,current_name);' q. q6 _+ S0 f; W9 [. s1 S
printf("%s\n", current_name_in_c);" i" d4 b+ \8 z+ s9 F
接著,,我們看一下訪問函數(shù),。模型可能有大量包含許多子對(duì)象的對(duì)象。由于不知道這些對(duì)象的數(shù)量,,需要能夠以某種方式收集要尋找的對(duì)象,。對(duì)于這種類型的問題,需要用到PTC提供的訪問函數(shù),。- ?3 x! S. c/ f* W" R+ D
假設(shè)想訪問包含在一個(gè)模型中的所有特征并收集它們的ids,。執(zhí)行這個(gè)指令的函數(shù)是ProSolidFeatVisit()。其包括4個(gè)參數(shù): ProSolid句柄,、訪問函數(shù)指針,、過濾函數(shù)指針和應(yīng)用數(shù)據(jù)的結(jié)構(gòu)體指針。過濾函數(shù)的目的是能夠過濾特定的對(duì)象,,請(qǐng)看下面的例子:
, E" s& N7 a: d' Qstatic ProError user_action_get_feat_ids(8 i* c4 K9 [$ G/ d7 Q! ]1 \
ProFeature *feature,,
E. ?# n* q5 RProError status,, K/ {) X/ x* W# E, D) \. I1 z3 z
ProAppData appdata)
4 r& F2 b5 z+ g" G{
4 l% L$ t6 e1 gProBoolean visible;3 B0 k1 o/ H, Y; l4 a
vector<int> *fids = (vector<int> *)appdata;
0 Z' `, N& W5 ^0 l2 QProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
3 ^0 j0 ?& `: L1 a2 L) F9 Pif(visible == PRO_B_TRUE){ // and collect their ids
- i$ _ i+ ^' Tfids->push_back(feature->id);* x" \, H6 i8 ?
}
( R+ z# c. ?0 u9 Zreturn(PRO_TK_NO_ERROR);$ P# x2 d# x+ ^0 S1 g) [4 t
}
4 [2 ]9 s M& L0 f: u) fvector<int> feat_ids;4 u- C" h G/ [& D7 l: c) Y
// the main Pro/TOOLKIT call
6 q1 N B* B4 k0 b, a) jProSolidFeatVisit((ProSolid) mdlhandle,,(ProFeatureVisitAction)user_action_get_feat_ids,,NULL,(ProAppData)&feat_ids) ,;注意前面提到的mdlhandle的使用,,在函數(shù)調(diào)用中ProMdl 和 ProSolid能相互變換。還要注意,,對(duì)于不想使用的過濾函數(shù),,賦該參數(shù)值為NULL。
, G3 h, J1 r. Y' V+ H2 k現(xiàn)在在feat_ids中獲得一系列ids,,這樣就能使用它們執(zhí)行一些任務(wù),,例如把它們打印出來:+ c# I9 ~0 |) M J
for(unsigned int i=0; i<feat_ids.size(); i++){: @6 h. `6 A9 B; s' h4 T+ |6 Y4 h
cout<<feat_ids<<endl;
" ~9 {, g: [1 ~3 ]# }0 q}
; y8 T: L& j/ N5 v& Q5 結(jié)束語(yǔ)7 D$ ]5 N; F C: l! R
以上提到的是需要學(xué)習(xí)Pro/TOOLKIT最基本、最常用的概念,。建議學(xué)習(xí)這些例子時(shí),,可以不斷變化的進(jìn)行實(shí)驗(yàn)。另外,,通過學(xué)習(xí)Pro/TOOLKIT幫助中的實(shí)例,,不斷深入理解大量的函數(shù),學(xué)會(huì)其使用方法,,逐步開發(fā)出用戶需要的Pro/ENGINEER外掛模塊,,以滿足特殊用戶的需求 |
|