|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
- Q1 W2 X6 h0 ?9 r2 Pro/TOOLKIT编程条件和工具
" I n S" |. _/ ]/ t) c 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
; k3 u) j& a# p( \6 c3 Pro/TOOLKIT程序中的结构体
0 `1 B* o; o0 D* `; F' ]2 e Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
- f: {& Z5 k4 a+ P/ vtypedef struct entity* ProPoint;- D( n9 @# {5 g& A3 G
typedef struct sld_part* ProSolid; I9 V) R" T K% l/ B
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。* u! T& J" P, W# z& F
typedef struct pro_model_item/ Y2 ~# T+ \- a/ @3 W
{0 z. V- ^( a" I! P% `: b
ProType type;% V: p% w( E- x
int id;2 p$ q- E, w6 k3 v, C
ProMdl owner;
' m& ?' a1 h0 R5 v ?. _}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,# H: W! a+ d0 {! t$ y
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
- u e2 k4 y. }' D
* d# E. Z3 E7 O" o1 D0 ]7 j2 A. G 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。, x4 ]( x" O" m, X8 ?- z8 n
4 Pro/TOOLKIT中的常用函数及使用
( ?7 b6 u) Q7 a 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
0 y: j* i; b2 i/ b8 i/ }( a: p7 RDescription: O5 E. A: ?2 d4 b
Initializes the p_handle with the current Pro/ENGINEER object.
7 Y9 J8 U; z, r# T }8 Y3 O- q/ KSynopsis
; K0 U6 }7 J) J* b# `#include <ProMdl.h>+ O v- R- O/ {% S1 M
ProError ProMdlCurrentGet (
$ G. s8 j1 F, R wProMdl *p_handle7 b0 |9 N# s `( I% x
/* (Out) / c6 x! b8 o0 O# ]7 d* j- n/ T
The model handle
& T5 i8 ?8 r3 N2 f6 H*/
' H& n; w4 ?' b0 W- U)1 v8 Z# a, i. l- N2 @- b3 L
这个函数包含一个参数-指针型参数,定义及使用方法如下。
$ g" \4 G$ q. t' L2 Y$ S$ M. x+ X3 YProMdl mdlhandle;2 G0 C8 B: n1 p8 ?' R5 q
ProMdlCurrentGet(&mdlhandle);, }4 @) E! d0 k4 G7 @1 g
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。% I6 P+ a/ B3 O( f" d* o
ProMdldata mdldata; R. G6 ?) ^: I$ y% J1 ^0 W
ProMdlDataGet (mdlhandle, &mdldata);4 ^4 o% ?; n# E4 _/ D* Q! h
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。. N7 R/ S6 _# v6 K0 Z, _
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:6 S. o5 M0 P. O' m- x. V' j
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */* j& P' E7 [! `1 ]& Y
ProWstringToString (type_in_c, mdldata.type);/ z! U. c6 f- o
printf("%s\n",type_in_c);" m% k' a- R6 z
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
e" A2 Z& l2 g; ]* DProName current_name;5 f' l" F! B$ ?, ^+ V
char current_name_in_c[PRO_NAME_SIZE];
5 d3 Q ^, p% E9 o7 sProMdlNameGet(mdlhandle, current_name);/ B3 H8 l- r( j7 a6 s. S. B
ProWstringToString(current_name_in_c,current_name);' q8 e6 g5 `, I$ c w
printf("%s\n", current_name_in_c);' k; w0 k/ F0 h! l
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。* }8 p; s1 V: p+ Y
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:- _0 U5 h& I; o8 d& p4 p' q* x
static ProError user_action_get_feat_ids(3 j6 E2 i: _$ G
ProFeature *feature,- P7 }+ Z1 r1 }$ g9 l- S6 B
ProError status,! x- t3 o, }2 c8 O1 p% q
ProAppData appdata)
+ P2 E z7 f1 l0 n7 X* P" W{, _! }' I- i- K
ProBoolean visible;, a3 v6 l- b' S9 a
vector<int> *fids = (vector<int> *)appdata;
6 j/ n0 h5 I( {: N8 hProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
. a% |* K0 m, }* e: d$ k5 b) w0 sif(visible == PRO_B_TRUE){ // and collect their ids : ^/ w" O1 L5 g7 S1 Y" T( b) b9 ?
fids->push_back(feature->id);
) c2 T# r" A; a4 ~; z- O% t. Z}3 f, Z, r( w2 J2 r( j
return(PRO_TK_NO_ERROR);
( a# D* ]- I# {$ ` }
8 W* @3 Z, f/ R8 B0 ~. j2 Uvector<int> feat_ids;& p" n' R; X) q4 p9 {2 i, w4 @
// the main Pro/TOOLKIT call$ ]' L# I& ?/ _4 G0 Q1 a
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
T5 k/ b# I9 [8 Q; S现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
7 m2 a/ O: w' _" C- E+ g |8 M3 `( tfor(unsigned int i=0; i<feat_ids.size(); i++){: L7 y1 D% B; e3 v
cout<<feat_ids<<endl;
- I( m" O2 ~) e( z7 y}
" w5 S: l1 n7 ^* G. b% Q4 J5 结束语
; S1 @5 v# `( W3 x" v/ e; c7 _: b 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|