|
1 前言Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。 & |% ]9 r5 r1 z. @. y5 A/ q1 i, ?) g2 u2 Pro/TOOLKIT编程条件和工具* r F7 n, x7 G' u1 Y& B 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。 ) y& }% u* A3 e3 Pro/TOOLKIT程序中的结构体) z% y" u9 U" G; G Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如: # M. j( p! M* Q* i; [' a, P# `& Mtypedef struct entity* ProPoint; & C& Y6 Z2 c- I ]9 Q: S y+ ttypedef struct sld_part* ProSolid; + R+ C+ q- p+ N7 S: ?这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。 ! i0 s/ }3 n* ]6 g, j! dtypedef struct pro_model_item% [* L- F) D) P0 H. v; m {5 }% \; C* N {. W& r, h ProType type; $ f/ Q( W6 X+ u- O0 I( z4 bint id; " \2 h1 P1 k% M$ B3 gProMdl owner; : c3 @ I1 t9 s}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,, |- k) \( J, q3 \/ r7 s ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp9 ]) n3 C' j2 |5 e. G4 \3 D
+ r! n: i$ G5 G& I如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。0 [( @$ [ p( ^$ M 4 Pro/TOOLKIT中的常用函数及使用& A4 F9 J; V( s+ |8 k6 {2 ? 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。 9 v. I& A: ^+ A6 p+ E+ w) Q0 [! Y/ p# \Description 6 s8 h& s+ q1 s3 J. x; y+ ]+ F" XInitializes the p_handle with the current Pro/ENGINEER object. * h( U& C! T4 o% g+ ]Synopsis 9 h2 f4 W8 O6 E6 t4 K& P$ N' U#include & R) P( o2 x) Z1 bProError ProMdlCurrentGet ( * z: |! K) W# gProMdl *p_handle0 x, ^4 |# g; k9 y, ^% y /* (Out) $ B/ ~) R5 U% aThe model handle3 p1 }- b3 n' h- X: i! e$ _# M1 l+ N */9 _& f! d+ W0 [3 |4 \/ R ) + z! j+ _9 C: r这个函数包含一个参数-指针型参数,定义及使用方法如下。 # P" h/ d: N \% s; b4 qProMdl mdlhandle; 7 Q( h" j' R) j% z' o( }ProMdlCurrentGet(&mdlhandle); $ ]) z6 d; v' q [mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。 ' ?! u4 A% a# Y' z. bProMdldata mdldata;i3 c5 x0 G& `( o+ J& h$ o ProMdlDataGet (mdlhandle, &mdldata);5 }- M1 Q! i- R) Z mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。 # ~+ A5 {5 P c+ \: j& u不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列: : e. f( i% g* S8 G; jchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */ ; E5 F6 R# F0 K* ?/ ~' nProWstringToString (type_in_c, mdldata.type); / @' A" C7 e/ @+ tprintf("%s\n",type_in_c); 3 V" A+ t" q5 i/ Y现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。 o a3 Z2 Z- A% ^5 \ProName current_name; ; F k6 H: N$ Ochar current_name_in_c[PRO_NAME_SIZE]; 0 D+ Q3 h5 L3 O ~8 CProMdlNameGet(mdlhandle, current_name); - @/ i1 G2 `6 y# d5 pProWstringToString(current_name_in_c,current_name); ; D2 W/ s' W' a- v4 {" uprintf("%s\n", current_name_in_c);4 `+ t& `& F$ w' V0 t9 _: M 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。+ Y! ^, ~5 z- t 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子: 7 n! R2 V0 i0 p* X b6 w7 r' t( S: Dstatic ProError user_action_get_feat_ids( ' b1 I) z3 Z( r4 L' dProFeature *feature,3 M8 Y$ V' f) a; ]. U8 I ProError status,4 v: _1 o# [. }& w0 O! o ProAppData appdata) - y6 K. N9 k( x9 i0 `; q{ 2 e3 f. V+ j; O( r& G+ qProBoolean visible;f% q5 P/ i( J* ? vector *fids = (vector *)appdata; 7 n- |' T9 C! X( ]" gProFeatureVisibilityGet(feature,&visible); /* only work with visible features */; P6 B" ~6 ? }& g2 Q if(visible == PRO_B_TRUE){ // and collect their ids' }: U! v: K8 Q/ q fids->push_back(feature->id); 9 I) G" Z' T" b5 M3 N}9 E: H3 P/ K$ P1 M5 l6 L6 [' l return(PRO_TK_NO_ERROR);! Y, X7 O3 C! `5 s/ n } : B0 O5 p/ J( R8 a# Y' G- Wvector feat_ids; % [* K8 f! j2 e6 m. V) X, U% \9 X// the main Pro/TOOLKIT call a# { Y2 j& `ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。$ F& L$ g- P( k 现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来: 3 g# F$ M/ ?7 T$ Lfor(unsigned int i=0; i, }, A$ b+ Y' Q$ _6 j$ O4 b6 A. E cout<</ q# G% v" |' J* M/ Z* k1 ]5 `}* X/ _% b; b3 W+ f* M, W 5 结束语 5 ?' p, Y( E4 W8 `* h以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|