|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
. U/ u, ]" X7 a7 ~( b4 }2 Pro/TOOLKIT编程条件和工具6 t. H, o1 W0 u, ~4 y- I
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
, n0 r) V, |4 ~3 Pro/TOOLKIT程序中的结构体( Y0 V8 F6 V# M/ R w) Q2 @- ^5 t
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:. @" i1 `0 @) r7 {
typedef struct entity* ProPoint;' z$ n$ Q) y4 F& L2 @3 r
typedef struct sld_part* ProSolid;
" F, K& d, `& P& h 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
( i2 g3 g& z z. ]* ^typedef struct pro_model_item
8 f1 d' w% g2 K4 X6 c7 J) u; V{" X$ i+ I& S2 d9 }/ D, Z
ProType type;5 h" T Q3 b( v4 F1 W
int id;& T1 f: y B6 q2 X( C6 j
ProMdl owner;
* B* G2 s: E6 y5 h4 m! T: e}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
1 E# S; h2 `3 x& p9 AProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
& u; h% }$ O; h0 ^
2 [: P6 q4 |! U7 }9 S0 |' J 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。- x L" T: E' Y! \4 K" S: d
4 Pro/TOOLKIT中的常用函数及使用
4 v) Q/ @ L1 d: k0 f' T 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
% z2 H, x5 X) ?+ c$ x' fDescription
! y* `0 I& h: N5 L: Z5 YInitializes the p_handle with the current Pro/ENGINEER object.
* C& @) R4 B& |2 ySynopsis" X% @4 N5 d3 c8 O/ }
#include <ProMdl.h>
4 Q0 b0 z5 D0 PProError ProMdlCurrentGet (
: [+ p/ O4 E7 |: \3 UProMdl *p_handle0 s$ x7 O, k( q u" T
/* (Out)
1 ~% c' b7 D |0 Y1 w$ c, w- XThe model handle
: ~# c- n& E( a }: m*/; n* m* @& Q' _: v: P. Q
); ?6 Y$ n( A% z- ^) ?9 \! ^5 _
这个函数包含一个参数-指针型参数,定义及使用方法如下。
3 l8 r0 o5 c9 Y& MProMdl mdlhandle;( l$ b* H4 T) d" a' V9 U3 p
ProMdlCurrentGet(&mdlhandle);
4 d7 P4 M2 ~0 `% ~mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
& e1 {6 L) I- C& ?+ mProMdldata mdldata;
, E3 N0 B) ^! V# nProMdlDataGet (mdlhandle, &mdldata);% U9 p/ k6 k% U3 o& C
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
: p- q$ z6 h* |+ T1 x! k 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:; i3 @; n- B) V2 `3 e# \" z$ L2 H
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
' F8 [' F; J2 G- z% gProWstringToString (type_in_c, mdldata.type);
/ [5 u# b2 ~9 t3 J& y! }% }printf("%s\n",type_in_c);3 | O I" ?) m+ P5 U
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。, s* G/ E: X1 y- k
ProName current_name;
0 {- D' k* z1 G3 V7 s) M5 W$ N, f- bchar current_name_in_c[PRO_NAME_SIZE];
e& s! x! B; [ProMdlNameGet(mdlhandle, current_name);
: R; q/ v @. p, r6 ?% K7 u) b% ?ProWstringToString(current_name_in_c,current_name);
; x4 Q* h7 M8 U& P" i- Eprintf("%s\n", current_name_in_c);
0 e! Y: ]) X/ f: D 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。( W4 V8 g4 M7 `! s9 d
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:0 F/ o$ o- Z) X: K4 O+ Q
static ProError user_action_get_feat_ids(" o; U, B0 S0 J* I; J) _/ z/ ~2 b
ProFeature *feature,
( A$ t2 v; U4 u: zProError status," ]3 m, {. S3 `3 c. f5 }0 ~
ProAppData appdata)
4 A6 _4 M* G7 Z8 P& A' n{/ S+ r3 W5 ]" W/ X
ProBoolean visible;7 F" \$ K. T2 V/ E0 x1 X
vector<int> *fids = (vector<int> *)appdata;
/ r' E6 ]+ ]# C& m" EProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
) R9 z, o) ?( d. O4 z! O# X: tif(visible == PRO_B_TRUE){ // and collect their ids 9 P, P% h, x* b
fids->push_back(feature->id);
. q( x( H# J6 Y5 u}
. |7 ~+ W1 S9 P! Ureturn(PRO_TK_NO_ERROR);
: } X( g# z7 | }* P' k! D4 e1 E# d) u
vector<int> feat_ids;1 f! h; A! e4 j$ P4 b' W
// the main Pro/TOOLKIT call1 e& n, r8 e+ K& A7 x$ C1 i8 F
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
& F B. h- d1 J: Y0 c& I现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:' c5 F- n# ]+ Q& i0 n, D
for(unsigned int i=0; i<feat_ids.size(); i++){
# G- y# k/ h% E4 M' |, ycout<<feat_ids<<endl;
) _; g4 Z( [ y+ v; p}
4 F; B4 _. R9 W3 f! _5 结束语
, b2 _ v k- F8 y, V 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|