|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
2 F A' M* \/ O. u2 Pro/TOOLKIT编程条件和工具
, ]% t$ G Q; K6 W0 }+ ?; k 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
2 o Y- Q6 Y& C- v+ \' n% E3 Pro/TOOLKIT程序中的结构体- R1 x- ?$ x* g5 W6 a
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:; b, A- A6 e0 J9 F; K
typedef struct entity* ProPoint;& M3 K. u: W6 o
typedef struct sld_part* ProSolid;
: t; ^0 G* F, ]2 \) O2 E 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。& U u# c5 W2 n/ C" B
typedef struct pro_model_item
. c/ j9 `3 J3 d8 n+ c! [; @{) g" w2 d- x$ W, d) N
ProType type;0 [6 T# s2 V9 b( |9 G9 g
int id;
# e4 Z3 x4 k3 H( k( o5 T! e5 r; tProMdl owner;
: f# N% U+ `! Y+ F# `/ r% _1 a}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,* n t: j9 x4 S0 |" O' i
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
9 _6 Y* b2 Z4 e& k ; w1 C& @: N! d! C
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
w; M! H& s3 ^* l5 m i4 T4 Pro/TOOLKIT中的常用函数及使用
: {5 K3 C8 ` j7 W1 i 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。( Z+ H4 Q) [+ K8 t1 x* V
Description
2 H2 p# F0 w0 \, n& s6 a# rInitializes the p_handle with the current Pro/ENGINEER object. & @6 q8 P9 e1 ^ ?
Synopsis. m0 k' F$ Y7 ?7 g c3 o1 k, a
#include <ProMdl.h>" t1 q/ ^* o7 ?: U
ProError ProMdlCurrentGet (
1 m0 K2 U# Y- g4 OProMdl *p_handle
, T0 m' f& @" c( _1 h+ \! z, O/* (Out) 1 [3 t0 x' U C! u: l9 z3 l& @3 F
The model handle
8 i! }- C! W& E2 y) |# g8 D*/, M, z5 l! N3 [1 T* h& ~* v4 f
); |- |, R# k( u b* _4 ?
这个函数包含一个参数-指针型参数,定义及使用方法如下。
7 `9 |8 ]* C# KProMdl mdlhandle;
) h7 _( k ]7 t( M Y0 J1 Y: WProMdlCurrentGet(&mdlhandle);1 t$ |7 ~# ]) s8 P4 f; m1 n0 y
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。: Y: A1 l: i d- F# C
ProMdldata mdldata;( `% |0 i) ~, G0 b$ X$ d
ProMdlDataGet (mdlhandle, &mdldata);. y% f; U# h F* V
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。6 a }5 E" ~1 K, l
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
: n# I! d3 j. }# Z/ pchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */5 d1 s- U% ^* O
ProWstringToString (type_in_c, mdldata.type);& H. g i3 r: X3 b
printf("%s\n",type_in_c);
& t( }* A. Z+ G- g. Z# `; H 现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。7 c9 X% R7 ]* g/ F
ProName current_name;
8 m; c, @5 F4 w& E( U! Schar current_name_in_c[PRO_NAME_SIZE]; 2 g$ u7 X# f3 P8 M
ProMdlNameGet(mdlhandle, current_name);* e2 f1 L/ p2 Z. e
ProWstringToString(current_name_in_c,current_name);/ i. H) X8 j+ v; A2 p3 e
printf("%s\n", current_name_in_c);2 |1 O6 X- Y) m1 b% G
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
* i9 X3 f5 O" B- Q' K5 F 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
% ^/ N0 p5 ]6 K% n* `% Sstatic ProError user_action_get_feat_ids(7 M4 {4 o7 t6 d5 t7 i4 ` G7 F
ProFeature *feature,5 U& r: i7 H- Z" D3 m( \3 o/ o
ProError status,
7 B4 T: {% B: w* RProAppData appdata)* @3 r; H# \* @$ h# c
{. }: f% I8 r6 U) p p5 v5 x
ProBoolean visible;: ~8 X0 B( i* x* |4 O! Z q
vector<int> *fids = (vector<int> *)appdata;
$ C* Y) f$ i8 Y, N; R1 \) OProFeatureVisibilityGet(feature,&visible); /* only work with visible features */4 z, w2 K3 s" Z& y5 m
if(visible == PRO_B_TRUE){ // and collect their ids
- J- x* | G! afids->push_back(feature->id);$ r7 w3 C$ } W2 w! D! D
}
: A# ^/ n, \4 t" N; vreturn(PRO_TK_NO_ERROR);( P$ S# R1 @# R: w9 R, v! A
}
) h) W/ b z8 I$ M, Avector<int> feat_ids;
& Z# t* \$ ~8 D; O5 S// the main Pro/TOOLKIT call! x$ g8 w, E( Q- R0 i
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。 _5 H/ s! R* L% U2 R/ w6 P
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:9 e/ F8 {/ p/ X
for(unsigned int i=0; i<feat_ids.size(); i++){
8 f+ o1 Z, B6 N" Rcout<<feat_ids<<endl;9 w6 _" _# y, C; @+ [
}
, O( B5 @% P( W" A( E: e! z) |+ [5 结束语
) y: H- ~4 W" H9 k6 k8 D 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|