|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
& L& D" Z, o8 ?; i9 P p' C2 Q4 |2 Pro/TOOLKIT编程条件和工具
( [: |; \/ u) p& V# y. t* S 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。/ b# S7 h9 X1 D& F
3 Pro/TOOLKIT程序中的结构体$ V( M6 c+ A' f4 i9 O( G
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:9 f. ^* x' Y8 p( m
typedef struct entity* ProPoint;
! [9 @7 {7 Q" K7 ~& ctypedef struct sld_part* ProSolid;
. i' h) [6 E: S 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
7 ]( ]. j7 }1 O7 d6 T; F- f% f( }! ttypedef struct pro_model_item
, f8 A ?+ m& _{% }% V. X( m Z; }6 k" S/ C7 t0 ]' s
ProType type;
5 T( o9 ^" t4 N; q4 \1 gint id;6 D8 v l& K2 A2 s; G& E5 D: s
ProMdl owner;
- i) T4 w+ f# S9 W}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
; r" d5 Y: \) C9 P! e6 l$ j' kProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp ! F' t* a( Y! ?$ v6 K* G
& }8 N* C8 P# g3 b' b 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。' n1 t7 @ M3 L3 C6 y1 V
4 Pro/TOOLKIT中的常用函数及使用
% a/ u, B/ F. j0 C 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。0 \ z5 U3 S T V
Description
% I0 h' ^; P( {/ x) ]8 c& z4 m% S$ ]Initializes the p_handle with the current Pro/ENGINEER object. 0 x/ N8 ?- ~( M) Y0 E* p
Synopsis
n0 I% _, K4 Z5 \. F9 E+ [8 o#include <ProMdl.h>2 U. L8 e8 t5 Q: p. P7 B
ProError ProMdlCurrentGet (7 f$ F! O" m2 s4 l ?8 s
ProMdl *p_handle
! O. E) e, q0 z7 n4 M/* (Out) . t. Y$ f; h1 o
The model handle9 u: A5 q% g7 n4 E) T
*/
* }0 Z) @6 u# J: G$ W" G% k a$ G3 F)+ C6 Q4 F( M; O4 A3 X ^, S! b
这个函数包含一个参数-指针型参数,定义及使用方法如下。5 i. s1 {" p9 | K, q
ProMdl mdlhandle;5 s# G. H2 G6 d' Z3 o- P) p
ProMdlCurrentGet(&mdlhandle);
9 ]% c, f2 T$ [4 ~: \: C Amdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。$ t- s% d; V; k1 v. @. f! ]2 r
ProMdldata mdldata;! s$ x) k, X/ {- l
ProMdlDataGet (mdlhandle, &mdldata);+ ]+ p }3 D/ |9 i) _( \
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。- e8 X7 t3 k/ S9 V' n& m
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
7 K3 v. _, |! ?5 Y# H' L! Ichar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
+ `% H9 l- F A9 b9 v6 T2 ^ProWstringToString (type_in_c, mdldata.type);
$ B- |- L3 z# }, L' uprintf("%s\n",type_in_c);7 D5 `9 m& J- {1 f; G" J8 f
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
3 @/ C" T2 ]' mProName current_name;
0 z5 n& G% N" D8 s# }. m2 K9 }# Bchar current_name_in_c[PRO_NAME_SIZE]; . ~9 N) a, c! _ ^8 C4 Q
ProMdlNameGet(mdlhandle, current_name);
3 z6 Y' O. \9 D; ~. a1 b1 i8 _3 E# KProWstringToString(current_name_in_c,current_name);
% N0 y9 F4 o- \6 { bprintf("%s\n", current_name_in_c);
6 b( x" G5 A4 W0 g: [1 R 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
8 d( G) ~' A( r( c$ c) c3 {7 ? 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:/ r9 u+ U( Q1 A. Q, O. n6 T
static ProError user_action_get_feat_ids(. U8 |' X) e0 C! a
ProFeature *feature,
: p" M8 y3 w7 \% e7 _# c2 TProError status,
( t5 m0 P' a2 ]4 h' }ProAppData appdata)6 T2 }/ U9 |1 ]( T8 m4 {
{8 @3 ^- f1 @2 y/ F6 w
ProBoolean visible;1 S8 ?+ S! F: f9 y
vector<int> *fids = (vector<int> *)appdata;
/ X. a; E- T; {+ wProFeatureVisibilityGet(feature,&visible); /* only work with visible features */ T# `1 @* A' ]8 t
if(visible == PRO_B_TRUE){ // and collect their ids 5 M0 x; N+ G' F( n& ?, T/ R$ m
fids->push_back(feature->id);
3 i2 [5 @" B2 g# c! u}" c$ a2 g, ^9 U6 e0 j" y& x
return(PRO_TK_NO_ERROR);
\3 {; b) ?* K }# @6 J) s3 [7 y: x \* t, @, `
vector<int> feat_ids;
& @) `' ?8 O* D// the main Pro/TOOLKIT call' q3 {7 {. h5 `, H ^) {
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
6 c; @# k+ s2 u* H; \4 |现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:" e8 U3 J, ^) k& G, J. _: D( o
for(unsigned int i=0; i<feat_ids.size(); i++){! I& K+ y( {& d$ g0 {
cout<<feat_ids<<endl;
! b+ | [' X. t* i2 ?}
2 ]! T0 s* n& N* H7 y! x$ I9 m5 结束语
$ k+ \( t+ ^4 b! V `3 ^6 c7 A 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|