|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。# T% H+ K; V2 e' }8 H/ _
2 Pro/TOOLKIT编程条件和工具
# n) B9 @& ?: d! l8 ~% Q7 x8 q" c 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
' M7 C$ i& c; A. j0 a1 y6 o9 p3 Pro/TOOLKIT程序中的结构体
4 I0 ^* I$ f- e3 T4 g' y Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:: T$ J0 m! Y, U* K, g3 V+ n
typedef struct entity* ProPoint;$ O" ^" {) q" s! U
typedef struct sld_part* ProSolid;
* [4 q( N* k- _/ Z- c 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
- F6 `1 r0 V$ w f+ \! R: E+ e+ Dtypedef struct pro_model_item
& J6 n4 c# {- ?! ~) b{
. m" s5 `5 B( t; CProType type;, g& _' m% G/ P
int id;# s* v9 z; |4 b% t# C1 \7 K1 k) H! h
ProMdl owner;
) m& F" R6 X0 [. Z9 e# [, X; `}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,7 ` \6 m6 c0 Y4 s6 _+ Q6 ~
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
" C8 e( G1 H* H0 P 9 [8 n+ A2 W& q3 h6 I$ o
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
. t0 ]; R! r* T; R% B0 k. U" W1 U4 Pro/TOOLKIT中的常用函数及使用
% ^8 Z: X" e* j/ L- j. c 需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
8 c/ l: }* J% }; V0 c L0 lDescription; `0 S! {' X6 g+ E. B% P5 C& F
Initializes the p_handle with the current Pro/ENGINEER object. / ^* J# I) t7 A! c# x
Synopsis
: j0 u/ `' i$ d# h: I#include <ProMdl.h>& ^/ b# }) u( s$ E( Y
ProError ProMdlCurrentGet (& J' }/ e% Q1 O5 k. ?# D- _5 T
ProMdl *p_handle
, f R$ J: z4 h- V0 }- q/* (Out)
, ~: S& }# v+ Q1 vThe model handle
- ?9 T1 w1 g) Y: s' T*/* Y- ^$ @7 {7 T- w
)8 W# V& d" @0 L8 \/ \9 Z9 _
这个函数包含一个参数-指针型参数,定义及使用方法如下。# k! m$ u" [2 {. C. U+ s. x3 \7 T2 J$ z
ProMdl mdlhandle;) p' P4 g! n0 I. N8 V2 [5 {
ProMdlCurrentGet(&mdlhandle);
) w2 ~% |5 j- S+ @ l7 H# Fmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
6 B; T1 n' R4 m" aProMdldata mdldata;$ ?5 `" M; Y# |; C n* l
ProMdlDataGet (mdlhandle, &mdldata);" O) O6 X$ x% x m1 |; n z( V" X% ~
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。# A- b6 P& K+ _4 ~" ^# w- N
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:+ d" N$ E- k/ q4 O, r8 S% m
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
. n! A6 p1 R9 C: N$ wProWstringToString (type_in_c, mdldata.type);5 [$ _0 ~$ h. s+ T& a' x3 ^
printf("%s\n",type_in_c);$ k9 \, ~* Y! K( j6 A' z4 F
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。) K) |4 e& {, n% u" m* O- p
ProName current_name;
# ]5 J" G4 t! K- u2 L: q2 zchar current_name_in_c[PRO_NAME_SIZE];
! g/ A, V2 j3 f2 s7 J3 |' pProMdlNameGet(mdlhandle, current_name);
. p2 I9 |6 y: @/ n8 X: eProWstringToString(current_name_in_c,current_name);% n4 a/ G2 U4 H8 H; G
printf("%s\n", current_name_in_c);
& o: r( F' T9 B" M 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。$ }) n, Z# n3 `; ^! x
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:; J: V$ x a R% q1 A6 J' L# j
static ProError user_action_get_feat_ids(
: W" n# c' l1 J2 U4 @9 v% UProFeature *feature,. U- d$ A, d! _% a
ProError status,
; D, ^5 F! v. D1 i) MProAppData appdata)3 u$ v" @" m9 d; Y0 N" ^
{
M4 t/ U/ P4 j: DProBoolean visible;+ {3 a( y$ @5 R3 H9 T+ H) u9 s
vector<int> *fids = (vector<int> *)appdata;$ R) s3 T5 q3 v3 I
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features *// }1 o4 _2 T% v# M
if(visible == PRO_B_TRUE){ // and collect their ids , y9 b" R7 ~. U! D& V* L4 p
fids->push_back(feature->id);; P! Z+ c' a( J- l
}$ m- ]8 @; M- d) I
return(PRO_TK_NO_ERROR);
' W, V5 w- w: F }
" O. R# C- W/ N. F1 F9 q0 ~vector<int> feat_ids;' J; A k3 b( Z5 s+ Q6 i
// the main Pro/TOOLKIT call% g! Y# u# c8 |" I8 b4 w; k
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。" M, W7 Z7 t Z9 w1 i
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
[2 A C2 i2 G0 `0 m; bfor(unsigned int i=0; i<feat_ids.size(); i++){
, e) N1 _9 h8 D) o+ c3 @cout<<feat_ids<<endl;& n( |* T" X: o
}- H: v: `0 J3 u1 V
5 结束语
& l- s& E4 z4 J0 Z6 f3 j# ? 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|