找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2870|回复: 1

Pro/ENGINEER开发工具Pro/TOOLKIT简介

[复制链接]
发表于 2008-8-6 14:00:23 | 显示全部楼层 |阅读模式
1 前言    Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
( X2 [2 t2 X2 f- I* w+ B6 D" y2 Pro/TOOLKIT编程条件和工具6 X$ b/ P& G3 }9 c
    知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。% `8 J( J( Q0 q+ e) U8 h& M
3 Pro/TOOLKIT程序中的结构体
# H, W% N) A+ v    Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
: U2 g. H0 J/ N; s/ T2 v! Z- otypedef struct entity* ProPoint;
9 X  Z5 ~6 x" t4 T. [+ P3 T# Itypedef struct sld_part* ProSolid;
/ M8 A3 ]: \8 Q; w+ A    这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。/ [3 P! e* O0 H" H# l
typedef struct pro_model_item
, F8 |$ }9 g. y2 |) {& `{
+ l3 K0 v) z6 V+ m* GProType type;1 \- |( p5 o4 F- c  F6 B/ z+ P
int id;
2 C( z  `% S% u3 QProMdl owner;. t$ U- P: e$ f7 d% q& [& b$ m) E6 h
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
# u3 u+ j" @- f1 ]2 ]7 P' p2 rProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp   
; O- s9 C3 e" s  k" |7 W
) ]% _! Z! e! J( A9 M    如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。. w* ?9 h* I  V* {! @
4 Pro/TOOLKIT中的常用函数及使用, u" d1 d5 G! U4 C! A- _$ y
    需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
- S2 K# D3 ]& i: E, I/ b' U: c( VDescription
4 z; B# A0 M: k9 h: ^2 DInitializes the p_handle with the current Pro/ENGINEER object.
$ t' ]7 S8 T4 r- r" S. q0 T) w$ pSynopsis' ^" O# x3 ~9 F4 T: i
#include <ProMdl.h>
( J- F/ I7 k4 K, b. V8 EProError ProMdlCurrentGet (
( ?- P  P6 l( u+ [ProMdl *p_handle" Q6 q% v: T, [0 J5 Q1 i4 x$ h
/* (Out)
" P- b) x+ D1 n( F% e( U8 T; Q" gThe model handle% Z+ d! H5 Q0 n) ?  U0 ~2 |
*/
7 x1 w) w; v6 A2 ?0 ]7 V): f) v0 Z: O) C8 n/ O7 d
这个函数包含一个参数-指针型参数,定义及使用方法如下。% U4 n6 S& N8 d* `8 `$ P
ProMdl mdlhandle;
9 A+ |5 Z5 V9 V  m3 Q* hProMdlCurrentGet(&mdlhandle);' ~& B: f* |9 F" d* ]
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
+ n* i0 k; ^5 L2 H7 x9 I" _ProMdldata mdldata;( s, a$ S( d/ U/ l  }
ProMdlDataGet (mdlhandle, &mdldata);. k. a% v% x) X: G7 w/ w2 Z9 }/ z
    mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
! A$ d* Y& S3 ~% F8 R) ~    不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:9 Q  J" v3 f9 K5 C  v. O
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
" N2 ?1 b) O+ u% qProWstringToString (type_in_c, mdldata.type);$ Q* s8 I( S9 K3 ]+ j% x* ^* f
printf("%s\n",type_in_c);
7 [9 J" m- d4 G    现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
7 \6 b# C, s' U% RProName current_name;2 x: K" G5 _$ `8 K. c7 J2 \' {
char current_name_in_c[PRO_NAME_SIZE]; 2 `3 E$ q& T: q( }( b2 S
ProMdlNameGet(mdlhandle, current_name);% w) L- T" M, W5 s) f- M
ProWstringToString(current_name_in_c,current_name);
* o- v  t* u2 W1 M) @printf("%s\n", current_name_in_c);( t' e) M2 L6 s% F  V/ }* w
    接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
9 I! d; R- t: _, d* V    假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
9 ~) P3 ]/ U" W- F/ ystatic ProError user_action_get_feat_ids(; Z' K! D2 z) r; c8 G
ProFeature *feature,
* {+ P* {8 I% l4 b3 \: kProError status,+ v9 k. C2 P* ^% q9 C
ProAppData appdata)
, U, w! x- }6 E9 n1 b# C8 [- Y- s( i{
) G  p( {1 M0 |8 EProBoolean visible;$ }: ~6 P6 [" B4 r- G2 b: y+ U
vector<int> *fids = (vector<int> *)appdata;
4 M3 B4 n( U: _' \, i/ h0 ?" NProFeatureVisibilityGet(feature,&visible); /*  only work with visible features */" E, z" {+ d  D' H; ?# `4 v! P
if(visible == PRO_B_TRUE){ // and collect their ids ) E$ C& }/ l. ^' {
fids->push_back(feature->id);
3 W# k, n: V9 Y1 L# p" U4 Z( [$ Y}% q2 }5 g5 s* M
return(PRO_TK_NO_ERROR);
, \& p% D3 \% A. I8 X9 H% z }
. N$ {% o4 a! }( mvector<int> feat_ids;- B/ N2 t, o% M7 C9 b
// the main Pro/TOOLKIT call" c0 s3 V! M& g7 o- B0 [
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。$ X! O- R8 m/ o2 l
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:4 Q1 I( T9 J; L' L5 C6 }$ l! i
for(unsigned int i=0; i<feat_ids.size(); i++){
9 o* l8 @/ ]1 V  _* D. p; Ucout<<feat_ids<<endl;) q5 A. J5 U! H4 z; g
}9 N; o0 g1 Y6 t
5 结束语+ I* c* W6 ^; v  Q; y
    以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求
回复

使用道具 举报

发表于 2009-9-24 11:22:21 | 显示全部楼层
楼主对proe二次开发颇有见地,野火2.0以后,proe是不是只能用vc.net做开发了?不能用VC了。据说proe4.0引进了vb的接口,是不是也是.net而不是以前常说的VB?楼主用什么工具?很想在proe的基础上作些工具,就是不知道怎么下手.
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-8-29 22:46 , Processed in 0.067751 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表