|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
0 H8 T3 s' ~+ y/ s( O2 _# H2 r B2 Pro/TOOLKIT编程条件和工具
2 ?8 E8 S# ~! H+ f7 e. Y' N/ ` 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。- o5 y& ^/ Y. D; p$ h( }5 N
3 Pro/TOOLKIT程序中的结构体. N) a7 V* l, P+ _
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:5 Q' |5 ^4 m& c5 y. ^
typedef struct entity* ProPoint;, s2 V9 J, {3 Z' ~% E- x; t2 L
typedef struct sld_part* ProSolid;
- s) Y" o5 i% ~ 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
, N% r5 l. R3 B* h+ ]# Itypedef struct pro_model_item
; c) ?) q" V) U( G# _{
: {4 I/ N& |4 Q% nProType type;
: g' _0 Y+ P, o( _0 U; u, Pint id;0 E, D- B+ U' s5 V
ProMdl owner;; m5 Q! E! _4 x' R2 z0 r/ E5 ]4 A
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,: o x# p5 n ^
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp # I' F& z, c. T) x& }6 T
% n2 M/ ^) ?5 _
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
4 z7 {9 {0 o2 [4 Pro/TOOLKIT中的常用函数及使用" Z: ]% x; i+ H9 W
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。9 M" D& }3 Z5 V2 P3 A/ b0 d g
Description
5 B! _8 M8 `+ aInitializes the p_handle with the current Pro/ENGINEER object. % Y9 x; H( e( i6 l8 E- G
Synopsis9 R: O4 R1 X( G9 C+ a5 \
#include <ProMdl.h>
u K. Y7 W" z" [4 FProError ProMdlCurrentGet (
* w2 q2 d& h+ M2 PProMdl *p_handle3 o' p: s$ d5 v( |. u7 d L
/* (Out)
( u$ L* o; K% sThe model handle
: s# Q; k# N u5 q*/
5 L" [) a- @3 E)8 v0 o9 h- d- `( c, p- E
这个函数包含一个参数-指针型参数,定义及使用方法如下。7 F) C6 L' h) G" U4 f0 K
ProMdl mdlhandle;
( X i3 P8 X2 M% w6 E. a. f7 AProMdlCurrentGet(&mdlhandle);
8 ~6 p, u5 L/ g- v, bmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
# @9 h4 W* g g" V; {ProMdldata mdldata;1 E- _2 W9 z6 w/ c
ProMdlDataGet (mdlhandle, &mdldata);8 J% x- t$ s$ h- Y: _* L4 ~
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
$ i' K. A1 q2 a: Z3 C 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:. H7 t1 Q! B4 y8 Y+ }2 k
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */% Q/ e) D* \& ]
ProWstringToString (type_in_c, mdldata.type);6 ^& a, }, D" i
printf("%s\n",type_in_c);7 G+ ? @' c j" p! J' o4 }
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。* @7 z+ A) w# @# H# ?0 k% y8 G+ A5 m: w
ProName current_name;' A; I# E7 J( n; M( v
char current_name_in_c[PRO_NAME_SIZE];
& h2 h; |( e0 n$ N3 U& E$ [' ]ProMdlNameGet(mdlhandle, current_name);
1 J$ W5 ~) R! I |9 S$ z/ {* Y: tProWstringToString(current_name_in_c,current_name);
; H2 R4 q# Z% k/ [; yprintf("%s\n", current_name_in_c);
2 p$ \" @! i) A3 p: d E0 ^ 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。& ]& t' t" }9 P \% f r3 `1 p
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:9 x; L) Y0 r5 Y9 U V
static ProError user_action_get_feat_ids(. ?& b6 G F: ~ e, |
ProFeature *feature,
" V' {! d5 ?0 e* j b+ _+ NProError status,& w3 {" D/ C- b X. U( z
ProAppData appdata)
, b' b, o1 {( e4 E) z{. I6 _( o6 |# E3 t; ]7 v" e, W
ProBoolean visible;: x2 t0 Q1 l! h7 u
vector<int> *fids = (vector<int> *)appdata;
( z) X9 ?$ Y" |5 Z9 n; a2 Y, q$ QProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
( y2 _! E$ i8 d, A$ }if(visible == PRO_B_TRUE){ // and collect their ids
1 h0 c7 Y0 L6 Q7 {# y% C8 F2 bfids->push_back(feature->id);4 P1 F. B4 V& y8 Y0 s( ?9 t! ~
}
) X/ S& C2 S( u; m/ y% u4 e: j1 oreturn(PRO_TK_NO_ERROR);$ G4 N4 P3 B4 O, `% K! W
}
8 N9 T3 T- o) [* z7 X) Qvector<int> feat_ids;
- {# N0 a) ]" T// the main Pro/TOOLKIT call/ z& Y% k6 w# k
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
1 k( C- b- \! p: f( \7 I1 T) d8 |现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
* [4 V; l7 r# lfor(unsigned int i=0; i<feat_ids.size(); i++){
5 G7 O E& [8 M9 p: G; ]cout<<feat_ids<<endl;
1 e: O4 Z, z& [! c2 \; j6 `}, T- R3 o' H- [$ j. q/ u
5 结束语0 ?0 B* A7 Q) M+ @
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|