|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
z! T9 g# o! f2 E. l: O2 Pro/TOOLKIT编程条件和工具# w9 e4 p! r9 ^( ^
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
0 {! `4 Z4 ^: H! n6 x: w3 Pro/TOOLKIT程序中的结构体. H& F$ J% Q4 ^% H7 i
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:: R' `' r5 e* l* I* r- z
typedef struct entity* ProPoint;
4 ^9 F. k& a0 ?3 c; O6 E1 ltypedef struct sld_part* ProSolid;
B) j1 k" T( t1 ~& [+ c2 r 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
1 W) H2 l+ V. m, htypedef struct pro_model_item
5 K, D: ?4 X5 g$ Y{
4 L& N, p' ?6 M7 A4 UProType type;
6 j- _( H0 r* V, {4 {5 x. nint id;
; i2 y/ C: M* O5 bProMdl owner;# J. c9 l$ ?& q6 z
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,: Z5 i/ j8 B% K5 r/ t( y
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp + d' J" v% J; h; k
1 W% ^8 U# ^7 J" U4 k! W
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
+ v' p: J/ W9 m7 \4 Pro/TOOLKIT中的常用函数及使用9 v# N3 n! t- f4 T% a7 @( P/ c
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。8 b9 r: S1 @. S6 p u, X- }2 Z, z
Description
' C& }0 ]! |/ q1 [6 h1 Y0 v6 N& hInitializes the p_handle with the current Pro/ENGINEER object.
3 ^* U7 U r; L9 E1 hSynopsis
' Q, a) D. j9 w: G#include <ProMdl.h>$ K3 ^" V: j- p0 w! |* x
ProError ProMdlCurrentGet (' O" I6 J; C1 V0 z# O
ProMdl *p_handle
3 a r' x2 ^) d- h# M( m/* (Out) ( @( Z8 H( I- {, V6 v0 o
The model handle3 x3 E* k, ^1 @
*/
; i- W2 ^' w- `& G) W; p)
2 s2 ]8 ]. g7 @: L1 Z' z. m这个函数包含一个参数-指针型参数,定义及使用方法如下。
( g2 M; _# o' q! JProMdl mdlhandle;1 d- ]& U, q; _* v& Y# i
ProMdlCurrentGet(&mdlhandle);: ^$ A0 [2 ^7 }4 d% {% j
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。/ y* b5 l, @1 n# Z7 ?
ProMdldata mdldata;
0 F, F' M' ]$ A- h) v1 jProMdlDataGet (mdlhandle, &mdldata);+ U0 m" A F4 ]: t! U
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
8 B5 ]! ?( {, M& p; X 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
* ^! r* K) c1 M5 [, ^ C: A7 hchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
' A+ D" Q2 U f+ F8 lProWstringToString (type_in_c, mdldata.type);! k' y0 _% j' t' d, w7 h
printf("%s\n",type_in_c); _; a* n' h$ z: [0 M
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
" S8 C+ h0 ~0 z8 B+ G2 G# rProName current_name;, W6 D% g5 U8 b0 w9 c& g
char current_name_in_c[PRO_NAME_SIZE];
% C) _- U! j/ B0 T, o* g- gProMdlNameGet(mdlhandle, current_name);& r! W7 K) l# o d& j' S
ProWstringToString(current_name_in_c,current_name);& @, H6 K# d' ]9 y2 A
printf("%s\n", current_name_in_c);7 l3 e! a& M/ t& S( ~$ p% I
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。: y4 _$ f- a! [" s/ }. \
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:2 E8 O) c4 }" L# B7 R
static ProError user_action_get_feat_ids(
) Z, a: e8 V4 G' l1 ?( }ProFeature *feature,- U( K1 i+ d% c. Q3 @& I. p7 B
ProError status,
* y1 [! R5 K" [6 h5 I' D8 |1 YProAppData appdata)
H5 m# h5 f6 k, W. W9 k{
[) z- t, q; BProBoolean visible; |1 q; d, S# J* x' h5 b
vector<int> *fids = (vector<int> *)appdata;* Z8 R( v7 m& M1 Z5 ?
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
' Q: p3 m7 {7 [; o2 k8 u& F' Sif(visible == PRO_B_TRUE){ // and collect their ids S8 R6 X! t* ?+ a% g
fids->push_back(feature->id);
7 E! v/ Z6 ]; r# ?+ r}
9 Y5 q" c& q- e* D6 ereturn(PRO_TK_NO_ERROR);
9 {. k$ U/ N4 S6 |9 S }
) K+ ^. \0 t6 A9 J' Jvector<int> feat_ids;
8 j A$ a! L' E3 d5 c/ i// the main Pro/TOOLKIT call
4 M6 h; ~2 W( b8 N# d7 [! I7 B8 yProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
4 W# c9 w! R5 Q现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
. t5 N, e/ A) l% O5 Cfor(unsigned int i=0; i<feat_ids.size(); i++){
" |) L- P) x" G% k% ^+ Bcout<<feat_ids<<endl;# J: B) y- U, x
}( m J5 R- N' Q2 e4 B
5 结束语7 _' g5 Q. a- P2 {" T: c6 p+ H
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|