|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
$ @4 n, R8 f7 U2 Pro/TOOLKIT编程条件和工具
3 {% ~/ h# ^; }+ w M 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。# |" s8 d% ~5 h$ W& ^+ P/ L
3 Pro/TOOLKIT程序中的结构体
, }" R& x% j) Z Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
# s4 O; y* @5 I% Etypedef struct entity* ProPoint;$ U' z# Q8 N$ i6 ]( W0 p
typedef struct sld_part* ProSolid;
: U7 y. f$ }; }, }" l 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。 i. G" y( Y: g
typedef struct pro_model_item
! \5 k$ v: R6 E0 L& K& G9 F{2 U! w% i+ s; o+ s+ ]: O
ProType type;' L% _$ q; u0 s2 U
int id;* Z1 z W+ H" h. R" Z# s
ProMdl owner;9 C" @# X% h- v) {' A# {
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,/ A: h$ G# f( I' ?1 q; i7 A9 N
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp * a. {! b6 H$ f* ?
0 v; c& d# L5 t# _
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。/ W/ ~* Q, T# n! ?" v
4 Pro/TOOLKIT中的常用函数及使用2 l: l+ J, B* s, k3 ^4 f5 D$ w
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。. G1 y7 t: Z) N
Description
* `( f5 j) x0 r, p: _0 XInitializes the p_handle with the current Pro/ENGINEER object. 2 O7 R5 B" b+ ]/ I
Synopsis
8 k3 V% l" m& p* V( Q( u9 ~#include <ProMdl.h>. t' B- E7 w! b/ N/ G& q, H0 }, w
ProError ProMdlCurrentGet (# u( b8 t2 O0 ~9 _5 i% e
ProMdl *p_handle
" q7 D' w1 O7 U" B$ ?+ H/* (Out) & l1 e+ _. w5 f4 A9 g1 X ~* j
The model handle w. Q# \ w0 ?) o; ?: Y
*/
! [6 z. d: \- w+ B. ~)' M- h. z- M# t9 t: m/ [ [
这个函数包含一个参数-指针型参数,定义及使用方法如下。
" g! P5 [ H) b9 QProMdl mdlhandle;
7 S1 V) P/ I ?" D2 SProMdlCurrentGet(&mdlhandle);
* z- f8 {$ W+ O. o! T K+ N5 Tmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。$ \$ i& t( V, p- V( N l/ Q/ i
ProMdldata mdldata;3 H- z( p' _! H3 ^& R" ]
ProMdlDataGet (mdlhandle, &mdldata);8 q6 y# W `2 \! O( x
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
4 G& j; e |9 t" C! l- [ 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:* t0 l9 z8 }3 N7 T) O
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
! S3 E& N' L+ K0 f) y1 EProWstringToString (type_in_c, mdldata.type);0 w8 ^0 P/ E1 x* F1 i, W) r
printf("%s\n",type_in_c);8 f* g: d" C( F$ F# f
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
" T. x1 Q- `: T% X' j8 yProName current_name;
$ h$ V! ~4 c6 g$ ~7 M, ^char current_name_in_c[PRO_NAME_SIZE];
$ H) g3 R- M* ^8 wProMdlNameGet(mdlhandle, current_name);# l8 q+ Q8 _: s. n5 v
ProWstringToString(current_name_in_c,current_name);! E6 T% Z6 y+ I7 X4 i0 ~; `1 r
printf("%s\n", current_name_in_c);) a$ M! _/ S1 r! u. N
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
4 ~6 H: r; x3 L( @1 ]* x 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
" k" M8 O0 Z2 d8 @static ProError user_action_get_feat_ids(
5 h+ y5 |4 |3 `& U2 u* f( S& jProFeature *feature,
- g4 O) T# _+ c' t8 d/ WProError status," |% j7 q- F# S3 c
ProAppData appdata)
0 g: D8 [/ T2 k{- A0 H6 J9 s$ a4 ]
ProBoolean visible;+ r Y; s8 Z5 p* f* S! V
vector<int> *fids = (vector<int> *)appdata;
; ]+ D) H W" I' `% O* r' dProFeatureVisibilityGet(feature,&visible); /* only work with visible features */& c' h7 t( m* c' E C l) N
if(visible == PRO_B_TRUE){ // and collect their ids ) p- C$ a: ~- R: B3 y7 x
fids->push_back(feature->id);* _$ }0 [1 ]$ i9 I* u! e% ~ u
}
/ s/ A* e: C: a' O' vreturn(PRO_TK_NO_ERROR);$ _0 R; M& z: [1 }$ r, c/ ]" o/ `
}. G2 i% v/ t/ H+ v" ^+ d
vector<int> feat_ids;2 E* t+ O' O& o7 f. n
// the main Pro/TOOLKIT call$ L, T* h7 U" R: \4 K6 L6 Q4 f
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
8 u" i7 \5 p& y: X, U现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:) R- `) c! A! u: d$ s
for(unsigned int i=0; i<feat_ids.size(); i++){9 \9 ?# n, k. L% @. {6 {
cout<<feat_ids<<endl;1 g: C' J' d4 K6 ~8 l" m
}3 q: X) a4 l) ~( p2 _
5 结束语
: S+ X& R9 U% j; o, F1 T) U9 C4 l 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|