|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。8 X n6 U* {8 @; Z# n2 H
2 Pro/TOOLKIT编程条件和工具& a/ c1 d8 V! Y2 Y6 F& P2 j
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。3 R& c$ q2 j2 r) H/ m
3 Pro/TOOLKIT程序中的结构体+ T# {7 Y/ H! Y' W4 @8 ]
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:) F2 D @6 E' n* f/ x
typedef struct entity* ProPoint;
1 H0 \9 K& G) i" Q6 jtypedef struct sld_part* ProSolid;; G7 {2 b; k5 @; P7 C1 M+ g p# ]
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
8 ]: _4 U3 W& X8 L7 ytypedef struct pro_model_item
7 L6 _0 s# J* v3 I7 D: y$ s{8 d; G7 Z5 a U/ f
ProType type;: @7 Z1 J6 J1 S# ]& X# I
int id;
9 L5 T0 i8 E, c( d5 ~ProMdl owner;- G6 R9 X" l# i" R6 C
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
% Y0 P8 A$ T# t+ pProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp 3 _0 B% N( M4 x, `) W
& y; c, Z# c1 ?1 b 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
, c& p4 @2 M; V! j8 x; q4 x4 Pro/TOOLKIT中的常用函数及使用6 k h& E9 h- v: H5 ?9 U2 C; ]
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。. X( h! h& F5 `$ d
Description
. j7 d) K, U- w3 XInitializes the p_handle with the current Pro/ENGINEER object.
% s+ q; n( ^' i2 b5 NSynopsis
4 t5 c5 d3 |" H" |% O' d1 y- R#include <ProMdl.h>
- ^7 z+ y X) EProError ProMdlCurrentGet (
( _, J/ c# U/ ^5 kProMdl *p_handle, s6 J8 S6 x' j/ }0 b$ i9 B
/* (Out)
% G ^ T+ z( _6 ?, `, z; Q+ hThe model handle& G* y1 u6 N& M2 }3 _
*/
5 n" x; [. k3 G1 D* w)! \# \" ^% o4 p7 B8 q
这个函数包含一个参数-指针型参数,定义及使用方法如下。. I+ x# H; a3 y
ProMdl mdlhandle;
/ Y( i& I3 A; p% ~! I' |ProMdlCurrentGet(&mdlhandle);! X4 v. j# S3 i& U
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
* e$ }6 G U4 q2 Y: u: BProMdldata mdldata;
8 l4 m A) ?8 E1 H* M, _ProMdlDataGet (mdlhandle, &mdldata);1 D! s) R/ c. y$ l! |$ I
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
5 l- Y& Y7 c. X) `' x5 W 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
( O* l0 K2 a5 y, r" tchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
7 J1 f& W, \) J- m, jProWstringToString (type_in_c, mdldata.type);
# H% n- {& m2 ~* i$ }+ h5 P1 x7 p6 yprintf("%s\n",type_in_c);9 L" p7 V0 _# z/ Y& `& i7 b
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
, u; [: n/ J3 U/ |4 x* n/ n" ]ProName current_name;
% d( K4 y1 R' H9 T0 rchar current_name_in_c[PRO_NAME_SIZE]; ' R3 I# Y+ C j+ H) K0 ?
ProMdlNameGet(mdlhandle, current_name);
0 A1 s9 g! Z% y1 h2 L7 i2 BProWstringToString(current_name_in_c,current_name);. z1 P3 W- S0 Z# ^# _
printf("%s\n", current_name_in_c);
( Q9 k- Y2 \3 V% T5 X7 }' ~ 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。1 q. E+ ^( r, y- Y: Q( ]
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:: B7 Y) z& [6 g2 U4 e( g5 S3 Z% n
static ProError user_action_get_feat_ids(
6 M) z% g1 u& I* g. E6 ~$ R( dProFeature *feature,+ ~& a0 G# {4 r' C
ProError status,$ S5 } z z7 m6 M' {
ProAppData appdata)+ ~! H# f$ U, g5 f
{; K( l) ?/ S1 W+ Y; Q6 d6 ]* l
ProBoolean visible;5 u8 r* D$ Y8 R
vector<int> *fids = (vector<int> *)appdata;
! S# W2 r" O( r- T. d/ @ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
1 a, N& H9 \( j% s5 h) Qif(visible == PRO_B_TRUE){ // and collect their ids 0 M5 |2 |& t) V- B4 o+ r
fids->push_back(feature->id);
( n& Z9 ^/ }8 H2 m% \. h}
! G. R; M% I. r- Q0 e" T& \return(PRO_TK_NO_ERROR);
0 U& h9 I; K! v$ Q }
- c$ w8 [1 x: I- {vector<int> feat_ids;
/ I6 ?8 R& \. n* m; V; {// the main Pro/TOOLKIT call
6 r) S& G! H7 \5 a% b" [ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
; F4 S# I) g4 K! `/ y& J现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
7 I$ F$ _& T/ R7 kfor(unsigned int i=0; i<feat_ids.size(); i++){ g& L+ I$ _& s
cout<<feat_ids<<endl;; v0 b0 e- v: |$ }; C
}
& n! f. v, ?* ]9 D+ ^) o5 结束语
S! f- _! t1 M. S 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|