机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2621|回复: 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)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。  i- ]8 y( \1 ], e* R
2 Pro/TOOLKIT编程条件和工具
) t0 I$ N  ^" p  D9 [& Y' H    知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
3 J) z* `$ S; w- {- k% q9 F3 Pro/TOOLKIT程序中的结构体
$ M- Q5 h4 Q* D    Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:) c: m- s+ @- \& M! X( ]3 ]
typedef struct entity* ProPoint;
: O! C9 r2 l( ytypedef struct sld_part* ProSolid;
0 N. A6 O- p7 |* F3 V    这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。0 y! z1 F8 i- `4 b& @" h; M
typedef struct pro_model_item
1 P3 h0 F. _! Z1 N$ W{/ W2 P# ]; e( g9 o9 O
ProType type;$ E' x4 k0 s& O6 @& ?0 F
int id;
9 j  E1 A8 c, W/ UProMdl owner;
9 m" |! t" ]% ?+ J}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
4 K/ x4 A) D# ?0 Y. k- M1 LProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp   0 j3 X* g9 g3 X8 w5 s

( h) ?! g. G' Z/ s    如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。5 F9 m4 @# W: z/ K/ I$ }/ b
4 Pro/TOOLKIT中的常用函数及使用5 ]1 @8 }: w4 t& f6 G
    需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。) Y5 v3 m. ]$ a" C! ]
Description: P1 X$ E8 e6 Z4 r
Initializes the p_handle with the current Pro/ENGINEER object.
/ r* S. H- H) o" ]3 u% C& `Synopsis
$ W5 y8 t  h& V8 s1 I#include <ProMdl.h>7 u% r6 t$ N. Q  t/ N; W+ [
ProError ProMdlCurrentGet (
3 W2 }% w! e+ W$ L4 K0 t3 JProMdl *p_handle
/ D% |& _( M8 }/* (Out) / s* l  l; U1 B+ _' c; X( r' x
The model handle
+ _7 o: c% B" d5 ?: Z* z( R*/8 L0 C/ L8 ]' }, r
)/ m  o+ ?. q9 G& S8 m; A! P
这个函数包含一个参数-指针型参数,定义及使用方法如下。
; w3 t$ s( U: r  ?% SProMdl mdlhandle;1 W) _+ Z0 _" g( j4 {
ProMdlCurrentGet(&mdlhandle);+ X- Y) g3 g' N$ B) a
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。5 }3 c/ W* u5 e7 G* ?) r
ProMdldata mdldata;
( h1 l6 ~: E. f7 q7 u4 _ProMdlDataGet (mdlhandle, &mdldata);
" g; k5 H7 g5 e' p% Z8 ^5 u/ A$ X    mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。" }9 w, s" O$ V6 M
    不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
9 o- ~4 v9 l( C: R/ Bchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */  P6 ^6 Z- q8 C+ N  z$ _" I; Q7 k
ProWstringToString (type_in_c, mdldata.type);
5 u& T5 e7 Z) D# \1 b7 E( |4 z6 Oprintf("%s\n",type_in_c);$ ^2 w/ b( m+ i' |3 `
    现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
$ m- U( B  [8 \. M5 JProName current_name;2 P4 t6 p( d. ]4 B' S4 N+ Y' n
char current_name_in_c[PRO_NAME_SIZE]; 0 x! x4 j5 }9 D  M
ProMdlNameGet(mdlhandle, current_name);/ n- c" h; b8 t0 h; u4 \; u
ProWstringToString(current_name_in_c,current_name);9 e1 j+ s" l* Q
printf("%s\n", current_name_in_c);" l6 R* \7 A* z+ v- O
    接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
9 H& c* A0 M: ?( ^" Y+ U+ N1 @3 @    假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:8 Y( V4 Q7 ?  I8 E* x- G: y
static ProError user_action_get_feat_ids(5 B7 S0 M& V& ^5 E) ^" a
ProFeature *feature,/ q* v. [3 G! U  h
ProError status,
/ M; E0 b" K, KProAppData appdata)
% Q7 s* o/ V5 j( U{) A; `) j* s" v$ o
ProBoolean visible;6 g$ m$ u! ~8 D& Q. b& @1 P2 D
vector<int> *fids = (vector<int> *)appdata;+ |8 k/ [$ c" }1 m1 |) F" r
ProFeatureVisibilityGet(feature,&visible); /*  only work with visible features */
- I# Y* `! R: i' p$ v$ @if(visible == PRO_B_TRUE){ // and collect their ids
' E# r2 u1 H, x* F1 [" }" V1 zfids->push_back(feature->id);
8 b- @/ I! Y# @}6 m. m. ]. \5 [( M  P& c+ `$ `: t: b
return(PRO_TK_NO_ERROR);
' n+ m3 v. K. E }9 u6 }4 Q6 P# v' D7 ~' G* D; }+ P
vector<int> feat_ids;
% k& u5 u) b: f, v. E// the main Pro/TOOLKIT call
  i- l  J* V- d. B+ }ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。7 I$ u4 Q+ F( d0 [5 ~# r4 |. m
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
3 }, @* ?( c- O6 E$ u- Lfor(unsigned int i=0; i<feat_ids.size(); i++){
1 L3 d6 d2 a# kcout<<feat_ids<<endl;1 c/ b  h4 R! |3 `( Y' P
}
& {/ w0 Q$ @1 V% y$ |) Z5 结束语
! u- I: ]: ^( y5 b    以上提到的是需要学习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-2-19 06:40 , Processed in 0.052535 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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