|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。- Q% K7 T0 Q/ j8 `# b$ C
2 Pro/TOOLKIT编程条件和工具+ i: s) M6 l! k3 e. L2 b8 I
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。9 W# K6 B7 _3 G0 w
3 Pro/TOOLKIT程序中的结构体
$ N6 ]" G2 e. { Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
* N7 q0 B8 N: B1 o" {) B# p5 W# Ttypedef struct entity* ProPoint;! f# X |4 W( I! w' _' Q. b8 y
typedef struct sld_part* ProSolid;0 y2 F. U9 n0 |7 y; H: ]; k9 c
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
' Q4 r3 U; X6 ~) Xtypedef struct pro_model_item6 l6 F7 C6 D3 I1 m+ P% d. t
{
4 M" \4 z/ B2 @ j( }5 _ProType type;
0 [, W# X& a1 D) ]! e Hint id;
; K& N' ~$ U0 D# a; q' zProMdl owner;
9 t f3 V, e) m- I u5 I7 I}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,6 B$ |& o4 y }, N
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
" f* f, M* W+ _9 V. d# C ( s4 x( G# | Y O J
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
& p0 M5 t' S6 o1 `$ q4 Pro/TOOLKIT中的常用函数及使用+ v! ~$ R: _ \' N
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。* J# i$ D+ C% p" o" Y
Description" S" G# \+ v# K: k6 ]' A& A
Initializes the p_handle with the current Pro/ENGINEER object.
2 g! @& i' J1 I" j& R: ^3 i8 ASynopsis( z5 F' Q+ o! |) }- c4 Z7 a
#include <ProMdl.h> l7 d4 q2 k8 z4 }1 q+ M1 f0 h
ProError ProMdlCurrentGet (" M& v7 }2 Z9 S& o3 L
ProMdl *p_handle
$ I( g! F& p2 V8 q9 _/* (Out) & O' R2 t) o; f- z. i& F9 c
The model handle
. S7 y0 r' E" `# t: a*/
2 r+ q* D/ J/ w2 C% h/ Q: p: l$ }9 y)3 i% w! J1 q* o. e1 y
这个函数包含一个参数-指针型参数,定义及使用方法如下。
' i2 T% S! c& f9 OProMdl mdlhandle;6 D- v# x4 [/ H
ProMdlCurrentGet(&mdlhandle);
) E9 }+ Q h' X4 V; w4 ~mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。+ w. l: K0 W* V7 ?: _- R0 p# ~
ProMdldata mdldata;& a) C4 k. N# [+ g7 d
ProMdlDataGet (mdlhandle, &mdldata);
* @4 _; U& H/ t; w4 f( n mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。% D, S6 p' p8 l9 S
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:% R5 \! U \- V4 q& H' y
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE *// D' ~; h; l! U+ w( j. P
ProWstringToString (type_in_c, mdldata.type);! [ N+ O- J; m4 @# a
printf("%s\n",type_in_c);; L/ ]- V: Y4 \9 q7 @7 h3 |
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
3 A, g# I' k$ q* xProName current_name;& U& t9 k2 p8 j% o0 I' ]" c
char current_name_in_c[PRO_NAME_SIZE]; 9 u8 Q$ U3 [- E6 ^. W& @
ProMdlNameGet(mdlhandle, current_name);
/ ] @% E9 p* |1 ]% i- J+ o3 Q) }9 D% OProWstringToString(current_name_in_c,current_name);
- `, i" h6 ?* T& x( Kprintf("%s\n", current_name_in_c);
3 y' v9 V5 W. Q, X( E& K: ?1 `1 G7 S 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
/ Z2 a9 E# G# K d 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:* E, o, G6 u0 i/ O3 a" P
static ProError user_action_get_feat_ids(7 S4 I8 r9 ?! X3 o4 s! x+ v
ProFeature *feature,! [$ }# j$ Y, a4 j# N7 f
ProError status,
- _- ]8 H( A1 pProAppData appdata)
/ f" J8 C' M6 q: c7 p0 W7 l{
, c" H# l; |0 u% j5 R0 \ProBoolean visible;0 e; R( n* [; ~. ?( A
vector<int> *fids = (vector<int> *)appdata;" S0 c" h5 y& X+ M) m) D
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
7 D3 T( h0 I R* j1 sif(visible == PRO_B_TRUE){ // and collect their ids
* E+ K E, `: L0 U$ yfids->push_back(feature->id);$ ~ S& B8 g. w) R
}
" D+ i2 S2 C% v) m# ^* Creturn(PRO_TK_NO_ERROR);
9 ~/ k! u) [) `) L# z; v: p1 E }) K$ b5 Y$ o- D/ p+ G n5 {9 @
vector<int> feat_ids;
3 G! a- d. ]9 P- S) Z! n7 h// the main Pro/TOOLKIT call
; y( p$ F& t: |1 }3 m0 [* Q0 aProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。' _6 I5 G; C! k3 u3 E
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:- a4 h0 F5 Y1 R9 z' O% l
for(unsigned int i=0; i<feat_ids.size(); i++){: n- c; N( h& p& y; q* }
cout<<feat_ids<<endl;
3 Y8 Z! ~3 s% n P' @}4 f" z: K7 f1 t0 D% G
5 结束语
- I6 n( \+ S/ n# l 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|