|
1 前言 Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
! i6 K# h# K* [6 W( ~- g) }2 Pro/TOOLKIT编程条件和工具
0 i9 `. H- c! C# } 知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
% }; o* Y4 }$ l% h& g# l3 Pro/TOOLKIT程序中的结构体
7 v7 d0 ~' f' A7 g2 _# L Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
4 p7 M$ ?( o% Ltypedef struct entity* ProPoint;8 i2 o- G1 C3 Q# ~4 p0 u) t' `
typedef struct sld_part* ProSolid;
8 v# S0 b& V+ Z: Z: p1 M 这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。4 O5 d# O; i# ^6 ^
typedef struct pro_model_item" {! p: c: a; k9 _! w7 q
{
7 ^' v* w* S; LProType type;8 l4 C& n4 W( ]+ l- D8 T+ G! d( B9 D
int id;2 R$ Y6 I3 W. f3 [
ProMdl owner;
, A( A8 B; a" L. i1 \}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
; U3 d5 i: P7 q6 }0 PProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp 8 K7 ^3 h% d6 f% m9 H" r3 P/ j. Y
, _/ S5 `- f& c- u0 {1 C 如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。% s3 a% h, ~; T8 K
4 Pro/TOOLKIT中的常用函数及使用" y# s; z3 L) a
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
, R8 r. Q) ]9 O7 R4 \0 SDescription
" }4 b7 w: b: o' U6 \$ M$ \Initializes the p_handle with the current Pro/ENGINEER object.
; f- ~& A+ K! TSynopsis: v2 A1 L+ r/ x) S( r" ]) R( \* d
#include <ProMdl.h>. q0 h0 ^' d/ V/ o" f0 a) j1 ^
ProError ProMdlCurrentGet (% G3 Q- E: R+ d. K" e t) S
ProMdl *p_handle, l6 G& s! a7 J5 g' h
/* (Out)
0 R5 p6 Y7 ]9 @9 [The model handle, L. F8 p5 R( [$ p; `9 m
*/
/ K1 o9 ]( K$ v5 o$ [8 f): J9 L1 }7 ~" v- @2 `' [5 X A+ f
这个函数包含一个参数-指针型参数,定义及使用方法如下。
, l2 k% t1 i7 E3 CProMdl mdlhandle;
% x$ f1 s$ p& K. @ProMdlCurrentGet(&mdlhandle);
' y1 i0 K3 b& `$ L wmdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。: m. S( g9 m+ o; _+ a
ProMdldata mdldata;* n% c2 m. z1 f- G9 [
ProMdlDataGet (mdlhandle, &mdldata);
5 J V& B/ ~3 O: ^' N/ W! {+ N! Z mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
# Z$ ^' C4 l2 n& R 不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:. u" S7 @, W9 @: R; I+ u1 q
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
) @& _ t, y2 G5 u/ K! E. mProWstringToString (type_in_c, mdldata.type);
; l% F) V0 v2 Q m# oprintf("%s\n",type_in_c);* E6 i3 P7 Y2 z
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
" r ^+ D X: W/ U, o! ~ProName current_name;
, E% V) c, I( E4 U5 o; |char current_name_in_c[PRO_NAME_SIZE]; & f4 Q1 n3 ~2 [
ProMdlNameGet(mdlhandle, current_name);1 h0 y! A% T4 W8 \* w
ProWstringToString(current_name_in_c,current_name);
$ w! B& }. M6 S6 q- Qprintf("%s\n", current_name_in_c);
- b4 J+ k& \( c( j; u 接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
" f" K- o8 T) B( t6 ? 假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:% S d8 t0 D6 M* `% C2 `- Q
static ProError user_action_get_feat_ids(; W4 n& H, {2 U
ProFeature *feature,
0 n k2 A( k, ~+ ]& LProError status,+ e+ \+ K- q h5 V# d
ProAppData appdata)
& G% O9 R! O8 x1 M3 k" B: ~+ p+ [{
5 P" u$ T3 q3 u* a8 Q/ i) {; \ProBoolean visible;; ^" _* w E0 Q6 a* N
vector<int> *fids = (vector<int> *)appdata;. ?+ ]: t0 E; s7 G( z4 z" U& t
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
# B! B& L9 Y, O1 Z( Y6 @1 mif(visible == PRO_B_TRUE){ // and collect their ids
/ w$ n3 f% a* ~9 V( a- y( Nfids->push_back(feature->id);/ Q$ G" u- l& Z) V
}: S ~% {6 P0 u$ o g
return(PRO_TK_NO_ERROR);
( ?3 W9 N/ C l# l3 u: w/ a) h. _ }* N9 I" |+ m- N
vector<int> feat_ids;# o# T M5 K) |. B6 h* ^
// the main Pro/TOOLKIT call
( R. d! B4 a+ ~ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
+ a" j, N& I) t5 [! |现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:! b9 c/ K# n0 x! N* q6 [9 u
for(unsigned int i=0; i<feat_ids.size(); i++){
1 x0 L" C0 U$ X4 u' S8 w, Y# _cout<<feat_ids<<endl;
5 ^4 { N8 e& b# G; u2 A, z/ B8 d}2 U5 w2 f1 z% e8 ^ w4 R
5 结束语
$ y2 q6 D' k1 O; U# S- U3 Q7 J 以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求 |
|