找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2934|回复: 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)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
0 P9 Q5 a( ?5 w/ A: k! Y2 Pro/TOOLKIT编程条件和工具
% I& Z" v+ S) w! B; N    知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。7 h& H. \" e$ w: {
3 Pro/TOOLKIT程序中的结构体. I- I7 h6 u( T
    Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
  J! c3 u/ w  J9 t& M& R7 b( Ctypedef struct entity* ProPoint;9 ?! w6 B; L" l5 i
typedef struct sld_part* ProSolid;
, _8 \1 ]# c$ x) t. Y6 G: A  L5 ?    这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
3 P$ e# R$ `0 x1 ?typedef struct pro_model_item
. }5 Y% d+ Q0 ?{9 _4 g, E$ f' c7 X9 F+ V# N4 C2 m
ProType type;
4 C+ b4 n, R, r7 Z, C% C- |int id;
0 _  F; o9 y2 b7 n$ a0 cProMdl owner;
% L7 V/ ]3 M. X5 a7 }. d- J}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,8 G! u' X) n; L5 w; `; f! @# m
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp   
. ~0 ~, N1 ]$ Q; D
7 y* i  z. Q! w$ C& @' W0 T7 }" j$ x    如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
% t- U' H$ W! G! P5 t9 o: ~2 R% H4 Pro/TOOLKIT中的常用函数及使用
: q: a# X+ N$ w7 D    需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。. A: z. V: Z; `1 E9 y8 T* b
Description
. E0 K, [& l3 R5 p# o; TInitializes the p_handle with the current Pro/ENGINEER object.
  R2 @6 b: E% E  XSynopsis6 I: E3 w4 X) b% b8 M7 I6 F
#include <ProMdl.h>! H: v$ }/ R2 \" F# M
ProError ProMdlCurrentGet (
/ y. V; R, N& o0 k/ zProMdl *p_handle
: t+ w8 G4 L& T6 w' x' Q  S9 s# e/* (Out) : u$ y  ^9 |* P' X3 c; o
The model handle: ~+ N6 q7 U# i" m7 n
*/. W! M& E5 m8 A
)
" Z' G) p; d2 O% |( U& r这个函数包含一个参数-指针型参数,定义及使用方法如下。8 k, T( p+ l' T& B6 e( u0 T
ProMdl mdlhandle;+ j* N1 X6 k9 c( b9 h! e
ProMdlCurrentGet(&mdlhandle);* m4 |0 g& T4 s. Z
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
! A% j2 n& w( m4 T' V! d8 m! DProMdldata mdldata;
* F8 d( I/ Y" pProMdlDataGet (mdlhandle, &mdldata);
. Z* h# b& I# A8 [    mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。0 Y' z! `! l9 ]
    不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
6 D! y& M+ @5 o: A+ Bchar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
8 n9 m9 ?; Y! XProWstringToString (type_in_c, mdldata.type);! }0 k5 Z( x* f( b
printf("%s\n",type_in_c);% X+ o- a) }1 b0 I2 Z
    现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。( B2 ~: V0 W  N' R
ProName current_name;2 F; N) d0 u9 n; N, x4 N
char current_name_in_c[PRO_NAME_SIZE];
! m5 L: P8 N  I; WProMdlNameGet(mdlhandle, current_name);, H5 T3 \- S) Q! Z' O, e
ProWstringToString(current_name_in_c,current_name);% [, E7 e$ S) M% e  ~
printf("%s\n", current_name_in_c);
7 T; M* n  N0 s5 O4 v    接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
7 S- R) n* a) |& u* f" \2 K    假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:0 B9 i* z2 Z# V, G  e6 q( ]
static ProError user_action_get_feat_ids(: @  b9 V$ Q" a6 H# {
ProFeature *feature,# ^! j' ~0 @+ P5 N; L/ J$ f3 q
ProError status,# f# e( D8 b4 ]& r3 M" `( c% z" g
ProAppData appdata)' B% b8 K# m4 ?
{1 h1 u6 d( V( k# N! B4 b
ProBoolean visible;* f- P  B- j" X2 R
vector<int> *fids = (vector<int> *)appdata;0 b5 D8 n/ _# J' h, Q" q; q# l6 r4 i
ProFeatureVisibilityGet(feature,&visible); /*  only work with visible features */9 t, _2 K, ?  r% L% K4 K, l5 g  v
if(visible == PRO_B_TRUE){ // and collect their ids 1 U* B) b2 g- w9 V9 y9 N
fids->push_back(feature->id);
! r0 c$ u9 G- ~  `& J% F, G$ g}
! m" s' M$ k( s9 A; {return(PRO_TK_NO_ERROR);# u1 ^7 \7 D; n( C
}
2 Q- m3 S$ g; i; o: n9 e% fvector<int> feat_ids;; f/ T/ J7 t; K+ W9 n$ E8 l: r
// the main Pro/TOOLKIT call
$ @7 ?  Q, O: zProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
" M9 R3 w/ J: f1 U现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:+ r6 e2 h. Z! u$ E1 P: N
for(unsigned int i=0; i<feat_ids.size(); i++){, c# T+ p& D# s9 S2 ]0 W6 I
cout<<feat_ids<<endl;
9 }- p4 E% b7 t$ x1 l4 o}
& b3 E$ x6 q! C4 j5 结束语
* P' K8 g7 |: q" u6 a* E    以上提到的是需要学习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-10-14 06:11 , Processed in 0.057586 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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