|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。) T9 M& G! [/ q# V1 z
2 Pro/TOOLKIT编程条件和工具, J# @: I, h1 Y6 Q
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
1 n) ]( b: ~8 }7 I- ]* w3 Pro/TOOLKIT程序中的结构体
3 S2 U7 v9 P5 V Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:5 H7 j0 u+ B* n+ `6 b
typedef struct entity* ProPoint;# R4 S+ C+ i( Y- B) m$ Z
typedef struct sld_part* ProSolid;
% c' y0 W9 ?: i1 }; d/ i9 l* U 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。" U8 |$ N+ n& [7 @* I# x
typedef struct pro_model_item9 d; x6 e1 Z" P s
{
. s0 t1 ^8 O9 r- K+ L* w! B5 tProType type;
; v0 r* E9 V( ~3 A6 H4 R5 {int id;, ~9 G, v9 m- ~% o
ProMdl owner;+ U# G- A; b0 ?) @' F4 ~
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,* }# _4 ^ Y' v; H7 R1 h
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
4 [# `1 b% e* x
6 d( K' P$ U& a9 N+ [0 D8 P6 L 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。3 p0 O7 d2 g% B3 x
4 Pro/TOOLKIT中的常用函数及使用/ w3 [3 u7 R* J2 n6 e& m" c
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
/ v0 d; e7 ]' k2 e8 E4 pDescription
7 {" _8 B) n4 IInitializes the p_handle with the current Pro/ENGINEER object. 6 P2 Q' ?' n) R) S7 U
Synopsis- M' h6 e0 \+ h2 a- `
#include <ProMdl.h>
P1 c& I/ t7 AProError ProMdlCurrentGet (: [5 |( M& L9 W2 a% _2 ? x- H
ProMdl *p_handle
+ s5 U/ ^1 `% t, k+ ?/* (Out)
& u) u$ B1 Z( z {+ FThe model handle9 h M* N O7 y T i
*/% A% `0 z; t6 D5 p' q
): W, V; j- p* Q' M8 r/ h
这个函数包含一个参数-指针型参数,定义及使用方法如下。2 R; Z# s- \; e5 w0 ]$ ^/ f
ProMdl mdlhandle;' n. n+ L) w8 `1 U" b" `8 [4 Y. D
ProMdlCurrentGet(&mdlhandle);- u0 Q4 P' [$ [3 G
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。0 ~5 z- @/ c( ^5 y7 S* |; U
ProMdldata mdldata;' B/ q/ }! H1 D" d, C! Z
ProMdlDataGet (mdlhandle, &mdldata);
# v: f: H0 S) l& u: W$ w mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。6 r& }% s8 y$ ~2 s U# v
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
& H& U% w* A3 _: ?. W3 Dchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */4 [2 n+ ]. n9 P$ `6 j- N
ProWstringToString (type_in_c, mdldata.type);
/ O6 S" H( D/ a8 t& }printf("%s\n",type_in_c);
; A, a5 \8 V- V# n9 P r) s% J 现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
. l6 e" m, T7 J# i; y& K; [ProName current_name;, B8 o: J: B7 k6 x! S* y) w; t6 p
char current_name_in_c[PRO_NAME_SIZE];
+ v' V$ b2 C- n! ^2 w1 ^$ `; gProMdlNameGet(mdlhandle, current_name);
- l! _# o& ~9 b) \, E5 VProWstringToString(current_name_in_c,current_name);, Z& ]: B7 |* M, E' B
printf("%s\n", current_name_in_c);! p$ o( F. x' O0 M9 N
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。' P4 T1 ^+ F9 |) P; A
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:) o( |; X+ L- G
static ProError user_action_get_feat_ids(+ h/ H) E+ W# b6 l4 c5 a2 U7 U1 |
ProFeature *feature,1 Z; d1 v, v) Y+ b! s
ProError status,
* g/ t; S! _6 x9 vProAppData appdata)
. |( ?4 a5 w! c2 z8 T/ ~4 P{2 V' q- s o3 J) n8 T. k
ProBoolean visible;
/ b; @7 G; B8 F1 kvector<int> *fids = (vector<int> *)appdata;
& S- s1 u$ o( P/ S3 dProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
8 `; U6 _4 x8 \& ?: Aif(visible == PRO_B_TRUE){ // and collect their ids
4 h9 R% K9 R( |% d- v0 Kfids->push_back(feature->id);8 ~* q' K9 k. i9 ~, X: k A
}; C2 y, Q; I# n4 [
return(PRO_TK_NO_ERROR);: W: J3 x$ S5 R8 u8 Y9 ^' K
}
8 ]) z8 N# Q! D2 P8 mvector<int> feat_ids;
* \% ~. t2 v& o% S1 } I// the main Pro/TOOLKIT call& j4 Q5 S) Q# ]
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。9 s: R, ]% P; w( L
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
- l I8 d* M9 K/ ?2 Z) v0 bfor(unsigned int i=0; i<feat_ids.size(); i++){
# f' o, B! W6 u$ Zcout<<feat_ids<<endl;
$ p' d: G4 F& p5 D# o! u. m$ u}
] v, x+ Z$ g* n. Y2 E5 结束语6 @3 \1 y* C/ @3 q% {) o$ W
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|