|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
3 r4 o# i2 f5 E2 Pro/TOOLKIT编程条件和工具2 J: I0 }# m0 G( Q$ B
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。' Z2 i, V' M. o8 W4 L0 v
3 Pro/TOOLKIT程序中的结构体
' S4 T! X. Y4 d( q% q+ T Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:# N1 O8 s( \9 A$ ]2 C
typedef struct entity* ProPoint;0 _+ R: x- a/ U0 p& f1 o
typedef struct sld_part* ProSolid;
, D9 @: }$ w5 x: ~5 c 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
$ b& I. i* `* b8 E$ R/ ftypedef struct pro_model_item
) B2 a+ k; N2 u{
" T9 G7 }; ^8 J' j8 o% E4 ?* ]6 n. _ProType type;
# _; `3 m) J# j% ^- Rint id;
. U9 L9 G$ C6 X4 ~4 NProMdl owner;, x9 Y( U0 a5 n9 `# u' }& p; {4 }
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
! y- W9 }& k DProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp - E, K; O. r6 O0 M
* t+ b7 p: A5 `' q# r
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。2 X" x: O; k- g! D, k
4 Pro/TOOLKIT中的常用函数及使用
! P' ]! A u. D: U 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
1 s+ L: e$ _; |Description
' ^1 z6 l0 s: s, [& l- C& FInitializes the p_handle with the current Pro/ENGINEER object. ' a5 |4 N C/ i1 x# x/ N: k* S5 t
Synopsis& r( h6 c8 p* k9 J0 P3 @7 O
#include <ProMdl.h>. ^1 |! Z) \ X( g% C
ProError ProMdlCurrentGet (
$ @6 t o6 v& Q7 hProMdl *p_handle4 w% ]1 f+ m8 K9 r' [8 W6 }
/* (Out)
6 V- f& i9 p, Z5 c$ |* ]The model handle
9 R; @5 `7 E- e: G3 q*/
/ J) \# P( W' p+ h0 N* @. l)
* [2 ]9 o% D' E3 k c这个函数包含一个参数-指针型参数,定义及使用方法如下。- @5 I- w" u( ]0 J' q6 Z
ProMdl mdlhandle;
: B q0 G, ?2 w! X+ V2 uProMdlCurrentGet(&mdlhandle);8 A9 r: h6 J9 o, |$ b! B
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。& m9 I0 ?" F+ C% C5 k& b
ProMdldata mdldata;7 `" M. `# z9 e! G+ P4 x
ProMdlDataGet (mdlhandle, &mdldata);) g/ P% ]: w* E( }7 s7 N' k9 M
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
( \8 B- ~; K# X5 k1 p* k2 V' ^ 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
3 p6 ]% ~' v q4 n# d1 U. Tchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */4 O2 K' F) r4 K# ~9 l; `. f! y1 Q
ProWstringToString (type_in_c, mdldata.type);
2 B. h" | V% V Z9 n3 Y) Vprintf("%s\n",type_in_c);
# }* h+ O7 l% u- I8 @0 J 现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。( F d1 S" B6 C& O+ M( ~
ProName current_name;( X6 a+ |" {' k9 u# O9 ^" c: I
char current_name_in_c[PRO_NAME_SIZE]; 7 `8 {: K: k) _3 E! z0 a# z
ProMdlNameGet(mdlhandle, current_name);' B. Y, v; ~. a+ a; m- J
ProWstringToString(current_name_in_c,current_name);. R' M' d p6 R" U
printf("%s\n", current_name_in_c);
+ h+ P/ p d% c) a. c1 Q' o 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
0 C& o0 o0 J) W1 b! ~ } 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:9 ~7 x9 |- D) l
static ProError user_action_get_feat_ids(
) P* U$ j1 S, P1 i# o/ m0 JProFeature *feature,
- B; J. X) a, `! E, }! }5 QProError status,' W& D* D! p& `
ProAppData appdata)
1 j; W2 u$ m/ z M{
2 J5 i8 \. f' t, u8 v$ X* jProBoolean visible;
, ]8 U- P# ?; P5 y( E3 N6 _vector<int> *fids = (vector<int> *)appdata;
' S4 s/ j1 N/ h3 bProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
8 l( O3 k6 K/ L0 U/ Bif(visible == PRO_B_TRUE){ // and collect their ids
1 n% \! K* g2 M. K( f& c6 l+ Ffids->push_back(feature->id);" a# f/ K9 q) }
}( s* O" O" h6 u( \# `
return(PRO_TK_NO_ERROR);" x- n6 C) |1 _5 f% g* G
}0 l" o( @/ ^! j( C, u
vector<int> feat_ids;+ ^1 \' U) E, O, D
// the main Pro/TOOLKIT call+ ^7 X7 L" ~( C, ~7 H- l) ?; z
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
" N6 @ d, Y) y$ X: k现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:( r0 h2 x1 p0 W2 ]. M0 G
for(unsigned int i=0; i<feat_ids.size(); i++){
. _& Y! x* Q" S0 wcout<<feat_ids<<endl;! D7 m+ D, o; k* k% y$ P! f
}
) ~8 R2 B1 [; Q$ J4 L, p5 结束语0 c2 j! G3 D9 l: D! Y' J
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|