|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。5 P3 j6 L# U L7 V
2 Pro/TOOLKIT编程条件和工具) i8 _$ U' i$ O6 M2 p2 e2 p Q
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
: v. c' {. Z: l3 Pro/TOOLKIT程序中的结构体
8 Q+ O" e! X' E1 D Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:0 t- A% e V( I" [6 B
typedef struct entity* ProPoint;* c! m; W' a: \- o5 K7 x
typedef struct sld_part* ProSolid;
1 Q' ^/ t! e; ]' w 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。& I+ z7 u8 x" X
typedef struct pro_model_item
5 Z' |3 b. d- g4 b: ^& g0 c/ K$ \{
5 a3 ^! F, f% n6 ~+ DProType type;
. @9 l( I# D0 o# z6 t8 jint id;0 q: q; R6 d9 Q7 Q7 a1 T' n
ProMdl owner;
; G0 [1 v4 c. U C+ z}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
5 U* v; u$ G3 p6 g2 VProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
, Z8 Z: C1 K3 k6 N- ^4 @* J6 D/ a 8 U" k& Q: P* T8 Q3 Z
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
; E) v. R; E5 w4 Pro/TOOLKIT中的常用函数及使用" X/ D' |$ `# o# g& T) l3 D
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。- t$ d A0 L% H1 ~3 d7 p) e2 K) U8 h8 |
Description' p# i6 H: y0 j8 t- r5 B% j
Initializes the p_handle with the current Pro/ENGINEER object.
% [6 N6 i* J! Q; G% W! m R% cSynopsis; L( I7 P% |1 a0 Z" G5 N' Z* s
#include <ProMdl.h>
l$ c0 ~- W* f* WProError ProMdlCurrentGet (
, q; O- V% k% h2 r# TProMdl *p_handle
+ \- ]( J2 x' _1 v0 n2 g: T/* (Out)
- B7 f8 s {+ V2 r t0 L2 s% GThe model handle
# C/ B5 J5 w/ a- L9 p7 J6 {- u0 f*/" m; `) Y/ d! B9 f- b+ N# H; Q
)
9 ?4 H# t+ A+ v9 {5 h这个函数包含一个参数-指针型参数,定义及使用方法如下。9 N% @9 U4 L2 q% `
ProMdl mdlhandle;
8 j6 y+ y( t0 D- E+ R9 W+ lProMdlCurrentGet(&mdlhandle);# ?$ F7 X1 c* E! r9 a
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
0 g/ Q3 S! n% s3 oProMdldata mdldata;
/ M+ w0 l5 u K8 J, g4 g9 uProMdlDataGet (mdlhandle, &mdldata);
+ H+ `" f! I- H( G mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
: V" U6 E5 q1 W) f2 P9 x 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:2 M5 F5 M* }8 B
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */: r& \3 b% D9 @# o; ~( S4 j) ~
ProWstringToString (type_in_c, mdldata.type);
( E8 l& a7 V7 C- @( Bprintf("%s\n",type_in_c);$ c, P$ y1 O0 M
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
3 M$ D; A" V+ H4 u3 X; n$ PProName current_name;! t) M; ~5 Y0 u" T$ Z% d
char current_name_in_c[PRO_NAME_SIZE];
% H- C8 h0 V* K5 n' B8 |ProMdlNameGet(mdlhandle, current_name);
`* \1 b. t) H4 P% y7 Z+ B5 x" oProWstringToString(current_name_in_c,current_name);
- O2 E% h( J' Fprintf("%s\n", current_name_in_c);
1 Z3 d7 r8 h$ L6 g 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。- A% d# s1 v# V
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
) k; J- h& Y5 p; D8 \ V% M& Istatic ProError user_action_get_feat_ids(9 T) h I. z9 }7 [
ProFeature *feature,
% l6 B/ A) W8 q; k) `ProError status,
s4 [& w2 G+ p+ H/ {ProAppData appdata)
3 K! b( x Q2 c& c ~{
) R0 L Y4 I" g% L: P/ x! ZProBoolean visible; y) J4 r2 p& k- j; l
vector<int> *fids = (vector<int> *)appdata;6 z5 x. `) c6 [9 B: \* o% a0 X% b- F# A
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
. n/ N9 }$ }: e. @/ m% Oif(visible == PRO_B_TRUE){ // and collect their ids 7 E: S2 f) W! L. p6 L- v
fids->push_back(feature->id);1 z5 J; Q+ d* t R
}
; w; \9 Y& q$ T" G' Ureturn(PRO_TK_NO_ERROR);& B8 q2 O% I) V& y7 U* ~
}
! M; A# x7 O z/ M& {vector<int> feat_ids;; U; O9 r7 h+ p; K& }& U
// the main Pro/TOOLKIT call
* L0 c% L& r. f1 I0 d& hProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
# i3 u# p1 K5 \6 J" _) S现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:1 A, p& i8 _3 t7 {0 l( m8 l/ F1 u
for(unsigned int i=0; i<feat_ids.size(); i++){4 i# E2 p+ B0 s1 g
cout<<feat_ids<<endl;9 _9 U, S% r8 M8 m) l5 m- a+ U
}
- W% J- \: S( d5 }# Y& I3 b) g0 g5 结束语8 S" g' i" u( h: A
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|