|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
2 U3 w; R; O( @% W2 M r9 n2 Pro/TOOLKIT编程条件和工具
4 E* l5 b1 ~, r2 Y/ ~* _ 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。. e* Z' A* e" F. v
3 Pro/TOOLKIT程序中的结构体: k H, u' e0 D6 i% n. F" K. V
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:2 X' M" o8 M7 \" A2 {9 u
typedef struct entity* ProPoint;0 s, K8 O( D0 e) z+ F9 }
typedef struct sld_part* ProSolid;
7 H4 J' z5 N/ \6 ~6 y, U, i 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。+ C ~+ Z$ B, a8 N7 a" M
typedef struct pro_model_item
) J6 ~1 w* H% d, V) P9 f( F8 W- V{
7 D# ~) N3 G1 Y _; B- D1 MProType type;
/ M$ ~1 }7 A4 Q0 q( Q+ W5 `2 sint id;, z+ z% L! X* N/ v8 S3 Q$ w' T0 q
ProMdl owner;5 n4 O$ N! \+ l! |
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,$ @" k/ U& U4 e' Q
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp : Y- _1 t8 m% b2 g
6 I$ Q: {, Q& i ]1 |' z
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
* H/ y Z+ v: } p5 A9 \6 T4 Pro/TOOLKIT中的常用函数及使用/ K8 w! r1 C" j, L7 f, {
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。# _" K6 ]- ^6 F+ d8 `5 [
Description
$ \5 s1 k0 k6 D6 ~Initializes the p_handle with the current Pro/ENGINEER object. # S- B4 z' O* ~ H, I
Synopsis
9 m' X9 W' c6 r$ G* S+ E#include <ProMdl.h>" X" B8 }* ?! M( ?% W' d
ProError ProMdlCurrentGet (
7 R$ T. y+ {2 Z$ |. p" pProMdl *p_handle D/ R! ~* v- X0 a
/* (Out) 0 V' P6 V8 ?, S. Y; f; r
The model handle
! W: s2 ]3 Q# T& @" M*/
$ r: A/ q0 O& f7 z- d; Z+ K)/ y( D4 Q8 A& r, \* f! j7 p
这个函数包含一个参数-指针型参数,定义及使用方法如下。
6 e9 r( ^8 f0 O) `6 e+ I- G! WProMdl mdlhandle;2 @! U7 q& k3 N1 B
ProMdlCurrentGet(&mdlhandle);
: X- F9 Q0 b( Z s9 W" fmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。% e. z8 G# d, O
ProMdldata mdldata;- ^4 n" Z1 Z1 Y* W
ProMdlDataGet (mdlhandle, &mdldata);. @, _; H7 b; a$ }6 T6 K J8 A4 \( |
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
/ h+ N( g+ `4 t& X9 r# s3 ? 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
/ N4 [1 ?; f1 ^) A& V; p8 ?. Zchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */5 F0 Z$ j q7 I& L
ProWstringToString (type_in_c, mdldata.type);# t1 }1 {. B# E% X
printf("%s\n",type_in_c);7 D' K2 ] l9 J0 f. k0 F
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。1 V# g, G. f: N. ?
ProName current_name;% M7 ?2 K& S9 L4 a
char current_name_in_c[PRO_NAME_SIZE]; $ I% R! i: [' \ w9 W9 g4 j
ProMdlNameGet(mdlhandle, current_name);3 ]1 X6 X8 b, B6 l
ProWstringToString(current_name_in_c,current_name);7 Z5 O; q2 f& X3 s
printf("%s\n", current_name_in_c);
6 K4 ^' Z4 k& ~7 c0 t9 N+ Y 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。 x: \3 p1 X0 D+ q8 G
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:; C, O# O9 z" q$ ^2 T
static ProError user_action_get_feat_ids(; O a) X' h7 t4 _5 O: V# O4 l
ProFeature *feature,7 k' J) y7 d4 K& u5 t
ProError status,
h& r/ d: p6 ^# d) Z( C* nProAppData appdata)
1 {6 j$ A8 M' S* P, n{
) j! }' ?$ l) j: }7 W6 [ProBoolean visible; u6 n M8 C6 X5 b
vector<int> *fids = (vector<int> *)appdata;- J2 f6 A$ R' V- f1 [
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
! u: @( v" @* U& a7 A' Xif(visible == PRO_B_TRUE){ // and collect their ids : O' \) `# C$ \) f5 K
fids->push_back(feature->id);! S) f1 R7 p: w0 c C
}& W7 y# C) [$ F4 H& k! Q1 @7 R
return(PRO_TK_NO_ERROR);8 j8 x4 Z1 L! U5 j' P
}
8 D1 h* t# C( Nvector<int> feat_ids;
7 r, O- z' e6 ^: v' W' M. |// the main Pro/TOOLKIT call
1 K4 x% Z" F) m- x& |/ ^ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
* p! J: D1 {# M5 w5 k) t, |2 }现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:4 o! }1 o& e4 Q
for(unsigned int i=0; i<feat_ids.size(); i++){' I2 `: B0 I5 X
cout<<feat_ids<<endl;
" y6 I4 T1 t# t- {2 n4 e. p}
' A; Q$ }9 [5 z) o# k5 结束语
3 B9 }" h' A. ~) G' Q" | 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|