|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。8 J: g8 `; u2 s* Y
2 Pro/TOOLKIT编程条件和工具9 L! G5 |- \" R' A4 }
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
! e) L: v- i) j" L! K3 Pro/TOOLKIT程序中的结构体
( I/ p: h7 \8 }* X Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
5 k. [/ Y6 U% D/ C% h9 ktypedef struct entity* ProPoint;
9 Z0 q3 L9 \3 A; i2 h! Ctypedef struct sld_part* ProSolid;
/ ]. a5 b. d' h4 {0 b6 ]8 K 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。. A0 U# Q3 U5 [# _+ b
typedef struct pro_model_item j) e" O- o9 S0 q2 |
{
; O7 y" Q+ _/ }/ D) @ProType type;" S; Z: h2 A/ [ @
int id;/ C. k5 k: r+ m( F* O' i6 B
ProMdl owner;
9 P, b/ l' D0 E8 t. a}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,/ @* w. s( k; ^% b
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
& r. A+ w& z3 \ * X2 p+ q$ o9 r. u
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。8 T6 x# Q0 V6 l9 Z8 H
4 Pro/TOOLKIT中的常用函数及使用9 ]2 A( O$ S6 ?: b$ w/ Y
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。6 @4 s' C: w1 ]! L4 B3 G; I% R
Description
0 C- }; W! D; j4 C( _Initializes the p_handle with the current Pro/ENGINEER object. 5 U& @6 U: B$ [5 [
Synopsis2 t4 G* v. N: F2 d
#include <ProMdl.h>
/ @6 E; J( T9 F/ U4 ^' ^4 QProError ProMdlCurrentGet (3 U) z! o6 g, m4 r. b+ M
ProMdl *p_handle* d+ L9 K4 K% o2 i9 v* }7 @
/* (Out) + \: |* P8 L. J x, h6 g1 t5 O
The model handle
) v& }, [; k; [( I& Z$ }9 j! Q*/, x8 a1 W8 @) ]2 O$ `1 [' W" ^+ Y
)5 f8 S2 E: ]* X a8 a5 Q: R! P
这个函数包含一个参数-指针型参数,定义及使用方法如下。
6 |. ]: s. M$ u8 {# O L" ?/ U2 J# qProMdl mdlhandle;; ]( V% [# d, A& f
ProMdlCurrentGet(&mdlhandle);: a5 C! o7 a$ O5 L& c
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。, t9 S/ r9 } x, ]# K4 [3 F
ProMdldata mdldata;7 A: U: c! ?9 M2 a/ g: q! f/ O
ProMdlDataGet (mdlhandle, &mdldata);, j" S. ^8 n, O6 k
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。! u! Y. g ?2 l o2 G0 f' Z
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:: G6 u# ~3 v- e2 }5 V, v
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */2 S' D6 T4 h8 z9 w
ProWstringToString (type_in_c, mdldata.type);
6 v: V8 }! X! m; [$ u& Yprintf("%s\n",type_in_c);
5 [- D8 K: {( O( Q 现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。+ Q8 l, K! u6 x+ `0 T0 p# ^, ^5 H9 W
ProName current_name;$ I* k2 m+ |: u, ~* u
char current_name_in_c[PRO_NAME_SIZE];
0 E3 r6 o9 |4 h7 U* Q4 XProMdlNameGet(mdlhandle, current_name); _, {8 S. _; H7 R' o
ProWstringToString(current_name_in_c,current_name);
: V/ }1 z1 V% L8 E- W% x) ~printf("%s\n", current_name_in_c);4 i/ H5 e: v# V6 \: I7 s
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
5 I9 l$ u) |% V* i 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
: A! Y% D5 R) l8 F7 G7 f* [) jstatic ProError user_action_get_feat_ids(
/ T* c2 c( f _$ r+ a2 mProFeature *feature,$ C- G0 g$ k' W. Y# k! y& `
ProError status,
. T" a% T+ H. P$ `9 C) PProAppData appdata): z& O! y2 X, K h) G
{
g! A. ^$ k* y- [8 YProBoolean visible;$ O* S9 h3 t$ D
vector<int> *fids = (vector<int> *)appdata;1 ~/ C3 o# x3 T
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */5 ?% I4 I3 d" [
if(visible == PRO_B_TRUE){ // and collect their ids
) z" t2 E! B! Q1 V# {0 N& N E& Vfids->push_back(feature->id);
3 T/ D5 P0 _ ] F}
. v* b" _3 _* P% Y5 T* `$ O) nreturn(PRO_TK_NO_ERROR);( \* a3 N' y0 F! g$ E: L3 x
}6 ?. I: d9 Q& O1 c8 G
vector<int> feat_ids;' ^( }$ M$ _/ g
// the main Pro/TOOLKIT call
* l( z8 ~% ]0 a3 ~% p, s. o5 n8 lProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
6 \0 l- y1 ~3 ?( l# p& c现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
1 ?3 I4 i5 i; O6 J( k( v1 H7 efor(unsigned int i=0; i<feat_ids.size(); i++){0 J2 E: P! P7 v8 P6 h
cout<<feat_ids<<endl;1 a6 f! f3 y( o0 ^/ p# R% D- Y
}
& z' F9 M* l; s) q+ W1 Z6 g5 结束语
8 I* L+ B- e0 B! m6 } 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|