|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。 i- ]8 y( \1 ], e* R
2 Pro/TOOLKIT编程条件和工具
) t0 I$ N ^" p D9 [& Y' H 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
3 J) z* `$ S; w- {- k% q9 F3 Pro/TOOLKIT程序中的结构体
$ M- Q5 h4 Q* D Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:) c: m- s+ @- \& M! X( ]3 ]
typedef struct entity* ProPoint;
: O! C9 r2 l( ytypedef struct sld_part* ProSolid;
0 N. A6 O- p7 |* F3 V 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。0 y! z1 F8 i- `4 b& @" h; M
typedef struct pro_model_item
1 P3 h0 F. _! Z1 N$ W{/ W2 P# ]; e( g9 o9 O
ProType type;$ E' x4 k0 s& O6 @& ?0 F
int id;
9 j E1 A8 c, W/ UProMdl owner;
9 m" |! t" ]% ?+ J}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
4 K/ x4 A) D# ?0 Y. k- M1 LProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp 0 j3 X* g9 g3 X8 w5 s
( h) ?! g. G' Z/ s 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。5 F9 m4 @# W: z/ K/ I$ }/ b
4 Pro/TOOLKIT中的常用函数及使用5 ]1 @8 }: w4 t& f6 G
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。) Y5 v3 m. ]$ a" C! ]
Description: P1 X$ E8 e6 Z4 r
Initializes the p_handle with the current Pro/ENGINEER object.
/ r* S. H- H) o" ]3 u% C& `Synopsis
$ W5 y8 t h& V8 s1 I#include <ProMdl.h>7 u% r6 t$ N. Q t/ N; W+ [
ProError ProMdlCurrentGet (
3 W2 }% w! e+ W$ L4 K0 t3 JProMdl *p_handle
/ D% |& _( M8 }/* (Out) / s* l l; U1 B+ _' c; X( r' x
The model handle
+ _7 o: c% B" d5 ?: Z* z( R*/8 L0 C/ L8 ]' }, r
)/ m o+ ?. q9 G& S8 m; A! P
这个函数包含一个参数-指针型参数,定义及使用方法如下。
; w3 t$ s( U: r ?% SProMdl mdlhandle;1 W) _+ Z0 _" g( j4 {
ProMdlCurrentGet(&mdlhandle);+ X- Y) g3 g' N$ B) a
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。5 }3 c/ W* u5 e7 G* ?) r
ProMdldata mdldata;
( h1 l6 ~: E. f7 q7 u4 _ProMdlDataGet (mdlhandle, &mdldata);
" g; k5 H7 g5 e' p% Z8 ^5 u/ A$ X mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。" }9 w, s" O$ V6 M
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
9 o- ~4 v9 l( C: R/ Bchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */ P6 ^6 Z- q8 C+ N z$ _" I; Q7 k
ProWstringToString (type_in_c, mdldata.type);
5 u& T5 e7 Z) D# \1 b7 E( |4 z6 Oprintf("%s\n",type_in_c);$ ^2 w/ b( m+ i' |3 `
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
$ m- U( B [8 \. M5 JProName current_name;2 P4 t6 p( d. ]4 B' S4 N+ Y' n
char current_name_in_c[PRO_NAME_SIZE]; 0 x! x4 j5 }9 D M
ProMdlNameGet(mdlhandle, current_name);/ n- c" h; b8 t0 h; u4 \; u
ProWstringToString(current_name_in_c,current_name);9 e1 j+ s" l* Q
printf("%s\n", current_name_in_c);" l6 R* \7 A* z+ v- O
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
9 H& c* A0 M: ?( ^" Y+ U+ N1 @3 @ 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:8 Y( V4 Q7 ? I8 E* x- G: y
static ProError user_action_get_feat_ids(5 B7 S0 M& V& ^5 E) ^" a
ProFeature *feature,/ q* v. [3 G! U h
ProError status,
/ M; E0 b" K, KProAppData appdata)
% Q7 s* o/ V5 j( U{) A; `) j* s" v$ o
ProBoolean visible;6 g$ m$ u! ~8 D& Q. b& @1 P2 D
vector<int> *fids = (vector<int> *)appdata;+ |8 k/ [$ c" }1 m1 |) F" r
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
- I# Y* `! R: i' p$ v$ @if(visible == PRO_B_TRUE){ // and collect their ids
' E# r2 u1 H, x* F1 [" }" V1 zfids->push_back(feature->id);
8 b- @/ I! Y# @}6 m. m. ]. \5 [( M P& c+ `$ `: t: b
return(PRO_TK_NO_ERROR);
' n+ m3 v. K. E }9 u6 }4 Q6 P# v' D7 ~' G* D; }+ P
vector<int> feat_ids;
% k& u5 u) b: f, v. E// the main Pro/TOOLKIT call
i- l J* V- d. B+ }ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。7 I$ u4 Q+ F( d0 [5 ~# r4 |. m
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
3 }, @* ?( c- O6 E$ u- Lfor(unsigned int i=0; i<feat_ids.size(); i++){
1 L3 d6 d2 a# kcout<<feat_ids<<endl;1 c/ b h4 R! |3 `( Y' P
}
& {/ w0 Q$ @1 V% y$ |) Z5 结束语
! u- I: ]: ^( y5 b 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|