找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2824|回复: 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)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。. N) W) H: x2 ?+ l% J
2 Pro/TOOLKIT编程条件和工具. Z# F; k0 ?4 X! o* x* u
    知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。" u6 g/ q3 `2 l+ P* C4 c
3 Pro/TOOLKIT程序中的结构体* R9 L0 _) Q; U3 H
    Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
  H, l6 e2 W. |5 v: N5 @3 Qtypedef struct entity* ProPoint;6 C0 {  J, m8 x  C- r6 `" r
typedef struct sld_part* ProSolid;
, d2 X& K( p4 b& J5 q    这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。5 ~- f2 q9 O- F# M. i
typedef struct pro_model_item. ^8 |" M0 o# D/ d( B/ G
{7 k! t2 r8 v" d( c0 v" K# b: C
ProType type;
2 [+ K8 ^# d! e" ]. H7 hint id;+ K, B  H4 l& Z4 d$ X- f% ~
ProMdl owner;
( G; X6 u6 ~% r5 o}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
  C+ s5 K2 M* t3 O$ p) v: B3 C' zProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp   . ]) m0 `9 q+ s, }4 `& j3 a9 A& L

1 {; J- W! Z# {, }9 M9 e; V# @$ ]    如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。+ O7 L$ p" L/ o; y
4 Pro/TOOLKIT中的常用函数及使用
, Q* n; Y+ x! C: M    需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。% {' @5 z) T: g. b
Description  }1 v. d# M  l3 Q
Initializes the p_handle with the current Pro/ENGINEER object.
+ Z% t9 _' ^: o/ U" g8 U  e3 m2 pSynopsis
! t% w. I/ I; |6 o1 P0 [#include <ProMdl.h>8 y* s3 C. H' G" _# A
ProError ProMdlCurrentGet (
: L, d7 u0 q: ]ProMdl *p_handle
$ y  Z. {' `7 h5 ^) u4 \/* (Out)
% ~7 w' I+ n0 CThe model handle
& P1 J) N" A* R: H' K*/! y- q* I: U, v9 A
)2 r6 O; ~; x1 C! D, w3 V
这个函数包含一个参数-指针型参数,定义及使用方法如下。) S* I. T9 b. @# @9 u+ v9 A
ProMdl mdlhandle;
; D6 H3 [9 ^+ kProMdlCurrentGet(&mdlhandle);* t/ T* }: t# P, `1 P8 o" c; n
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
3 |3 w( G5 B8 hProMdldata mdldata;
* Y, V  B  e" h  ?- eProMdlDataGet (mdlhandle, &mdldata);' u, Z+ f$ f3 }* I$ A% N2 m
    mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。% U' a+ y' i  X% b7 s) f2 B
    不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:8 }! Z+ I9 r5 U1 N
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
. a( A  t. K4 z$ ?: U  P: R+ [/ Q0 cProWstringToString (type_in_c, mdldata.type);% N. o& t2 y6 m5 W) Z7 s
printf("%s\n",type_in_c);$ p( S# r" [( D- N
    现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。# g% t0 m+ d: j4 E; N8 [0 n
ProName current_name;
5 M, o/ Q4 m3 C  j( A, ~' z! Rchar current_name_in_c[PRO_NAME_SIZE]; - i2 [& z0 y; a0 P# r5 F
ProMdlNameGet(mdlhandle, current_name);0 H" D. s  [; _
ProWstringToString(current_name_in_c,current_name);
" n6 |' d5 j8 ~" X8 D  ~; [" Z: Cprintf("%s\n", current_name_in_c);1 n$ t4 W6 Y- h  {
    接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。0 t- L7 n/ F# O0 i! a; {' G
    假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:% q8 F: l, ]/ u/ ~
static ProError user_action_get_feat_ids(! j8 l; v+ E, A, z4 L; x3 }
ProFeature *feature," R, z; F6 f6 d7 U" x( Q
ProError status,
0 e8 B+ V8 O; D$ S0 _# P2 zProAppData appdata)$ M+ Z8 l5 ?0 [
{
8 z, A* V( _* R' V* L4 eProBoolean visible;
+ @9 m' i' v3 o- q( S: Svector<int> *fids = (vector<int> *)appdata;
$ c% O; b, j2 xProFeatureVisibilityGet(feature,&visible); /*  only work with visible features */" S* h7 z! ]* w
if(visible == PRO_B_TRUE){ // and collect their ids
* ~3 g% T* z/ |. Nfids->push_back(feature->id);
1 b" G6 N% i( w. s! J( A8 F}
% R# M5 o4 E: A' y3 Lreturn(PRO_TK_NO_ERROR);' J+ T2 X: c" H7 Z4 M2 _) u! C" C
}
( B" A/ E" h# T/ p# |2 N" Uvector<int> feat_ids;
9 M- A+ ?; C2 J% N( I/ ~// the main Pro/TOOLKIT call$ \4 d& ]( i; b3 N) ^
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。7 y3 s- T' i- o* A
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
  o5 s# L0 A4 [5 A& x7 O6 H: R0 Wfor(unsigned int i=0; i<feat_ids.size(); i++){
0 o6 u- m' T6 @. @, m2 m) J/ scout<<feat_ids<<endl;# |7 h* u# q7 P1 c# b4 H
}4 s9 i) {+ T0 b  `4 U" V5 K: r% Z
5 结束语
2 F( I2 D# [5 a* R7 m; i    以上提到的是需要学习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-7-4 14:59 , Processed in 0.063045 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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