|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。% q, A; @% Y7 l+ g# G; M# [: ^
2 Pro/TOOLKIT编程条件和工具
, p6 O. o0 M g0 X. }6 h3 O* D 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。* u; ?$ U9 Y! H' p2 e9 M
3 Pro/TOOLKIT程序中的结构体
2 S; l5 w! T- l. h$ V7 z Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:! W4 z( _6 d) E
typedef struct entity* ProPoint;; r; z/ ~; C( B$ U; M! m
typedef struct sld_part* ProSolid;1 r! e5 o# V1 _$ J) B4 W- E
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
+ d y" X5 B' F/ v @2 dtypedef struct pro_model_item
8 W2 a" G1 G5 k0 z* L3 s{+ F5 W0 }1 ~& w- ~; g( f4 f+ n
ProType type;9 M( j! J! L4 |0 p& F( i! X
int id;
5 V. z: b, u: }) Y/ n0 V" q/ u2 FProMdl owner;, ~" N9 i7 y. t7 H/ C( H$ ^6 D
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
9 `3 X* T$ T7 G, \ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
1 `0 L7 N; t b
2 V- o8 z1 u% v% j/ o 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。( m* v% O1 v. m7 y. _2 G3 ^3 U
4 Pro/TOOLKIT中的常用函数及使用
" b" r) ~; ^ W, G: H 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。1 Q% U" G* W6 U' T- ^
Description
`: W7 \8 W3 V0 AInitializes the p_handle with the current Pro/ENGINEER object. + }; ^/ s5 J. x% \9 Q. ~
Synopsis' ?: R) O, l$ F0 v. v% p, q( I( n
#include <ProMdl.h>
. s7 T' c2 B/ E8 f$ x+ ?ProError ProMdlCurrentGet (
( i' D* }/ H. L5 c6 X$ t- G% eProMdl *p_handle
- S0 P2 h( B8 X, t3 R2 \, H ?/* (Out) ) O4 t8 _% j. K% [& E
The model handle
/ i1 s, M3 W7 \0 r) r( M4 }*/
: D i! N. N( ?9 W)
7 S' Z, _; ]. n5 x3 N3 k/ w }1 c这个函数包含一个参数-指针型参数,定义及使用方法如下。
% A1 Q0 A% c% U: Z# Y3 k1 U5 y$ t; eProMdl mdlhandle;1 G# V4 i$ y4 e8 b/ e3 i" L
ProMdlCurrentGet(&mdlhandle);1 k7 q% M3 \" V) \) s
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。, j% j8 U2 T0 P7 A1 v
ProMdldata mdldata;
: I V; Y1 O# H. wProMdlDataGet (mdlhandle, &mdldata);
" p p t* z8 }/ m mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
8 r) S) X: M# x! ` 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:+ x4 f1 |% U0 J$ ` v4 k0 A7 `5 r
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
- U3 L& U% N+ M/ p. }ProWstringToString (type_in_c, mdldata.type);& S c3 V# G" t H$ Q) I& ~
printf("%s\n",type_in_c);
# l( m0 a* \2 j1 }4 } 现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。3 ~) d7 C# u* b, V2 {
ProName current_name;
: [( h. V* T& d3 X& kchar current_name_in_c[PRO_NAME_SIZE]; ) C N6 ^& N! H* }' `% w
ProMdlNameGet(mdlhandle, current_name);; I) o. Z+ c! [: y% V5 T
ProWstringToString(current_name_in_c,current_name);+ {9 w' d' x- ]8 R( A) s
printf("%s\n", current_name_in_c);4 ^ n5 t0 ?% }( R+ h) ~
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。9 U! P; W$ B3 t$ V2 Y
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
9 ]: c% @( g' {$ k& |; ~ kstatic ProError user_action_get_feat_ids(
7 G [8 I% X) C, S; b' _ProFeature *feature,! ~+ I' Q$ b) H1 @
ProError status,
* x2 \! w) i! U, i9 {7 uProAppData appdata)* Z2 M; [: J$ ~! M0 j0 V9 o
{
, h0 I1 @4 {% Z! o0 F, l7 zProBoolean visible;
% t4 d) L, e) @2 Z: n5 uvector<int> *fids = (vector<int> *)appdata;2 J. Q/ l, A# _% E& F# F) E
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */5 D1 d% m3 S* |- `) o
if(visible == PRO_B_TRUE){ // and collect their ids - B! x' [% T8 Y6 b
fids->push_back(feature->id);7 `! f1 ^+ o( T/ g8 n9 W2 z
}8 i2 k* J! @+ k! g# ^
return(PRO_TK_NO_ERROR);
. _# ^ s! @- W8 g I }
, j- y, Y2 G. k ?5 z6 b; kvector<int> feat_ids;
0 C9 ^5 n2 z u1 K$ H% L// the main Pro/TOOLKIT call
9 [. a2 C! L7 f2 r1 I2 DProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。4 @ w( c' J* A& D
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:' C4 I X/ u- L# ?
for(unsigned int i=0; i<feat_ids.size(); i++){' D" S; ~. X; J+ V$ W
cout<<feat_ids<<endl;
9 j D+ ]( ]* Q; p+ A}
0 l. P( @+ b% n$ D r4 f5 结束语" C0 Z0 P0 h! {# T+ G7 A
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|