|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。" }! f. S+ W) ~) I
2 Pro/TOOLKIT编程条件和工具3 p. s" k! z6 |
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
1 A4 G) r8 q, X" a0 H. {- e3 j3 Pro/TOOLKIT程序中的结构体& i/ v! R% n9 g* F% R1 I' K
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
6 P6 a! J+ q$ j, y/ Ttypedef struct entity* ProPoint;, e: R8 v" n7 |& w" ?
typedef struct sld_part* ProSolid;5 J5 P2 K8 a4 c2 S, O# d& [0 k
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
* t* M9 `& }6 ?, V# p+ m% Ctypedef struct pro_model_item% j: \: C" M* r4 x. H( y1 ?2 c
{6 r! a" g, L B* t5 K' R4 \
ProType type;
4 F# y3 q3 X/ d' Oint id;& g, T" B" [- i
ProMdl owner;
" f7 v: o# |2 `" g% ~}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
1 i/ F# X- `( `ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
( q' \+ F. L* k/ r
. s$ q( \: c/ l! `2 H 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
. h4 {% U% D& x, C$ n+ A- W7 y4 Pro/TOOLKIT中的常用函数及使用& Q+ V7 S; x- `3 b. T7 C2 u
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
- ~, O M' J) l0 s5 Z$ {Description5 o6 e8 }' S' C2 K I
Initializes the p_handle with the current Pro/ENGINEER object.
4 q1 h. a: N0 i) A8 E( DSynopsis
* q) ^9 `6 B) I1 A2 n7 M#include <ProMdl.h>
1 |$ c/ V- J! E8 zProError ProMdlCurrentGet (7 S+ P; u# g# ~) }
ProMdl *p_handle
6 b' v, o! b# y8 Y/* (Out)
4 s, _" z/ u7 ]% [The model handle5 s8 ~7 s" N. _/ L. }4 Y& D3 v
*/
5 s, K1 _9 S% [/ d8 y9 M)/ I$ K6 s& X, D8 k: x* P
这个函数包含一个参数-指针型参数,定义及使用方法如下。: l5 a$ y4 ]2 d7 ~8 y
ProMdl mdlhandle;9 S d/ y5 M6 ~8 _, c/ p
ProMdlCurrentGet(&mdlhandle);5 ~0 z, U! F/ d4 [- t) H
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
# }# V& s* U8 U) C3 IProMdldata mdldata;- m6 t8 K, ^! c, h: p: }1 C
ProMdlDataGet (mdlhandle, &mdldata);% Y* P; g1 {* h; ]2 }
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。6 ]. a% d+ K8 ]/ {6 z
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
% H$ v2 ~+ F" x S& Hchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */9 A. h% ~5 ]1 W: U5 G6 C: _& K
ProWstringToString (type_in_c, mdldata.type);0 K8 {* z7 J: w, i
printf("%s\n",type_in_c);) u3 P8 ~. B t; y7 {
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
0 H6 ]/ d d' a6 eProName current_name;
& H4 d. }5 f- d1 S5 U" Jchar current_name_in_c[PRO_NAME_SIZE];
8 W; D8 F6 e6 I. u) v" s& p& qProMdlNameGet(mdlhandle, current_name);4 \. w* f- y! ]# Z6 J
ProWstringToString(current_name_in_c,current_name);
7 E" v, i: V% U5 c- x/ \! W& Fprintf("%s\n", current_name_in_c);
$ s7 ~$ g8 k1 |" w 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
X d% }# c! y) I9 C) H+ p 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
+ A5 Z& s! v# i+ K& [# ~; Kstatic ProError user_action_get_feat_ids(# C5 i" b! K; q8 R
ProFeature *feature,
( U) W2 A' x0 \0 d9 XProError status,' I1 P0 z; r" w( F
ProAppData appdata)
! O# g& Y! K% y' R- Y( I{
! d, ?4 E# q+ v$ B) o+ rProBoolean visible;7 y7 ~5 \5 L0 O+ [
vector<int> *fids = (vector<int> *)appdata;
. B4 l% u' V& p& z3 ^& Z! B- tProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
1 X6 z& D/ X: T9 N$ u3 P6 d$ xif(visible == PRO_B_TRUE){ // and collect their ids " U* X( [. m! Q
fids->push_back(feature->id);# S# O% ^$ \ W$ w9 V+ I( T6 T
}3 M. h. T U N7 A
return(PRO_TK_NO_ERROR);) O4 _$ H8 Y2 y4 s- w$ {' V# A" \+ ^, m
}1 B/ k6 L7 T8 i' i% M C# t
vector<int> feat_ids;
& C+ s# v1 K m+ p9 v// the main Pro/TOOLKIT call
$ i2 V0 m0 V# C+ k2 Q- q- _- [! DProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
' p' [ q) }; p现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:1 E% |+ |5 x7 R6 U
for(unsigned int i=0; i<feat_ids.size(); i++){
- [" H. ^6 Q1 u& Ucout<<feat_ids<<endl;
+ F9 z( M& F% l9 J8 ?6 a( z}
6 B* v' I/ {( ~) y6 V3 p5 结束语4 O n7 x0 S& I E# C+ }
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|