|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
5 J0 ^4 i% f3 E+ T2 Pro/TOOLKIT编程条件和工具
* U, U( d3 g4 `/ u9 f8 B) E# p 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
1 ^ |' l% |$ R0 h7 d5 }0 r3 A$ `3 G3 Pro/TOOLKIT程序中的结构体
' i% c& A1 ~( ] Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:8 X' J& |" Z* Q( u9 I
typedef struct entity* ProPoint;! ]( ?; e1 C5 i7 b h$ G; {5 P
typedef struct sld_part* ProSolid;
3 v. c, }% z& B+ ]% s8 i K; }8 e$ a 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
# Y3 ~1 I8 m E& f2 htypedef struct pro_model_item
/ S q! F# @& I+ o! u{
# P" q7 C" B$ m; o aProType type;
9 l2 l' ?4 f8 j- ?3 ^int id;
# t/ g, ~! m! G$ \8 @8 j% U+ lProMdl owner; `3 J8 M( m4 e% D9 W# G; D
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,. N- G( y( q# ?1 R! R2 F# e0 U. P
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp ( M8 E. @: c7 E$ C
3 d+ O: D% i9 q: }( V( {# R- s
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。( `4 M+ `# k+ M( l: j
4 Pro/TOOLKIT中的常用函数及使用$ H' t6 f+ t) b! q( D, V
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
2 C0 h& T. `( f8 e9 [1 |8 vDescription' |9 X- C( e% `& L7 w
Initializes the p_handle with the current Pro/ENGINEER object.
1 E5 H2 [# P5 X7 W8 [# zSynopsis" Z! y0 ]' q. J, z6 }/ T" A3 a
#include <ProMdl.h>. Z3 e" [% F4 c9 ?7 F
ProError ProMdlCurrentGet (
& g( h7 }& d1 J# j9 QProMdl *p_handle
3 u0 s4 v2 d$ J* k/* (Out)
7 L9 j) T( E! L' Y! ]% E0 mThe model handle
0 E& u5 o+ Q4 I" l*/3 H7 U8 g1 D7 f
)
2 q3 C7 o/ L& U这个函数包含一个参数-指针型参数,定义及使用方法如下。
$ v( O, ^. p8 q% U+ y, PProMdl mdlhandle;
1 P, ]8 `* f1 Q3 y2 QProMdlCurrentGet(&mdlhandle);
, c; X9 \# }6 h0 H+ ?* xmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。5 y l0 @3 u4 I% H. r i+ m# F
ProMdldata mdldata;* L5 A( A6 k4 h; u
ProMdlDataGet (mdlhandle, &mdldata);
: R6 H: T+ m5 D) ]3 \ mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。4 I. x: ?9 S8 H
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:0 q8 E) }5 e' E) Y# l7 d2 g6 _
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */: b0 X6 g; l H' a2 G/ I% B
ProWstringToString (type_in_c, mdldata.type);
% |: b; F) s. X T) `% Rprintf("%s\n",type_in_c);. B3 { \6 J- J- o" |% \
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。1 R8 t5 \ O" v3 @
ProName current_name;, _- M! c- H8 z" S' H" t
char current_name_in_c[PRO_NAME_SIZE]; 2 v* P- n: K0 f, r5 }
ProMdlNameGet(mdlhandle, current_name);
" L5 e& n; @2 L3 E5 K" zProWstringToString(current_name_in_c,current_name);; `0 m3 R( k, P$ H
printf("%s\n", current_name_in_c);
0 i4 v* E. k; ~% w 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。2 Y; J: F2 W3 ]* U
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
' G. @2 e |. Z3 z9 u0 R0 Pstatic ProError user_action_get_feat_ids(
1 z" a, u3 t, z% }4 m, Y; H* m2 LProFeature *feature,& Y$ b& [( e( ?) W) n
ProError status,
$ v( B, Y4 x* S3 X. j5 u' Y7 iProAppData appdata)1 i% C% n9 W) K0 m
{1 S7 J! k2 T: R( W# R& f
ProBoolean visible;& G/ s$ Y: [! o) ?& G- \
vector<int> *fids = (vector<int> *)appdata;* i: j# ~; u; i# G' ]+ Z
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
; t# t. z. ^4 a: K$ ~0 vif(visible == PRO_B_TRUE){ // and collect their ids ' n: o3 M% L4 j- c# a4 M
fids->push_back(feature->id);
4 q; Z$ g3 N! i8 z# i}
+ w: ?& b( ^; E+ jreturn(PRO_TK_NO_ERROR);
% I d% ]- h A5 d2 | }2 M! @4 q1 }! S3 J% n
vector<int> feat_ids;
. t# @2 l! Y% Y6 U// the main Pro/TOOLKIT call
- d" v2 t" W9 {7 M! RProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
2 J l$ C d& H! g4 [2 K, Q$ k现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
, D# w& n M- B' o* x3 kfor(unsigned int i=0; i<feat_ids.size(); i++){* @- F! x. n9 ]3 K1 s- w
cout<<feat_ids<<endl;
+ x" [: R# j1 W+ \}8 ~* ?7 o N% D6 [ `( u1 i
5 结束语
1 `+ A- z4 {2 Q# g+ r% K- u" q, i 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|