机械必威体育网址
标题:
Pro/ENGINEER开发工具Pro/TOOLKIT简介
[打印本页]
作者:
sunshine1026
时间:
2008-8-6 14:00
标题:
Pro/ENGINEER开发工具Pro/TOOLKIT简介
1 前言
Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。
5 w# p8 x! [( u9 w, b& p3 g
2 Pro/TOOLKIT编程条件和工具
( k( [. m- R/ r
知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
7 s; y9 ^& d+ ]$ q7 j
3 Pro/TOOLKIT程序中的结构体
, a% a& C+ }( r+ x* [/ i' t
Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
" p0 l. C8 @1 \5 r' z2 n# ]* v( ^' i
typedef struct entity* ProPoint;
" c9 |" r, G& O! m# I
typedef struct sld_part* ProSolid;
4 @0 K7 { s# z+ t: b
这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
) r- M4 p+ t3 ? v
typedef struct pro_model_item
. J* y! _" q9 F4 {+ R; x( s' z H
{
$ w8 N: {, l& Q* v# Q+ [+ L$ v
ProType type;
. E- U( q Q# B3 j0 Z5 s
int id;
% E6 o5 b/ g2 J; J7 a3 i, h
ProMdl owner;
- C6 ]0 U- m! t& E/ P3 L9 ], g
}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,
3 G2 Q; |8 I7 F A
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp
2 E$ m. c( n0 l3 a$ a6 N, N
; g8 v" v* f) s8 p4 [
如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。
4 [8 j H0 D e
4 Pro/TOOLKIT中的常用函数及使用
# e0 m6 \1 }! z2 K$ m" J2 Q( k8 H
需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
Q) Z1 i+ V" r- |' `4 a
Description
2 N$ X x, w/ T# G& a$ Y( _% ]
Initializes the p_handle with the current Pro/ENGINEER object.
" a8 d/ }" u9 r) h
Synopsis
$ Y4 S6 W; s3 @
#include <ProMdl.h>
' Q5 d4 ?1 k# Q: L7 V
ProError ProMdlCurrentGet (
, n5 K: t- i8 T0 l
ProMdl *p_handle
( i# ^+ q, z0 r. {6 Z9 M( {2 P
/* (Out)
6 a2 ^, U- F1 }
The model handle
3 {/ |# y8 r- Y) L7 L' Z* ]* t# y2 ?
*/
% H7 r/ \/ Z4 N Z& C/ ` Q# V
)
, F1 P: r$ X, E0 g3 A8 v
这个函数包含一个参数-指针型参数,定义及使用方法如下。
4 S5 f& ~7 m2 r |2 W; V" ^3 X: S
ProMdl mdlhandle;
6 u: f' ~( U& S( s
ProMdlCurrentGet(&mdlhandle);
1 L/ @0 z6 H& Z9 |4 r+ [% j5 _2 B5 `1 k4 z
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
1 T4 c H3 `; V( ]' ~6 I' r8 q
ProMdldata mdldata;
- p1 |/ b& Z) R. b8 v! C
ProMdlDataGet (mdlhandle, &mdldata);
, s7 }/ D# I/ ` y+ P0 z
mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。
: q6 H" Z4 \. k! Y# l0 J. ^5 O
不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
9 U- Z3 }' F7 Z; p- a6 n' @5 {# T
char type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
# \& j' P `( q
ProWstringToString (type_in_c, mdldata.type);
; u: L3 d* D6 a5 _. P% U
printf("%s\n",type_in_c);
1 y3 O7 ]. |8 n) V+ U) w. t
现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
* p6 L' c- ~1 [- q) }/ S5 f8 N6 i
ProName current_name;
! P% q+ o9 l& P2 P1 }* R$ k& h7 C
char current_name_in_c[PRO_NAME_SIZE];
1 ^5 W: k, N9 n4 [+ e2 S& j+ s
ProMdlNameGet(mdlhandle, current_name);
. f, p2 Y& n, ?2 O3 H) @
ProWstringToString(current_name_in_c,current_name);
* ]8 G) A0 k# b1 t! ?( @" W
printf("%s\n", current_name_in_c);
5 G3 M N. _* d+ P9 h2 _
接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
! ?/ P- d8 m4 I, j; B
假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
6 a0 r2 V# @3 @* ` z
static ProError user_action_get_feat_ids(
4 g; C2 S6 A4 ]; g, v( t
ProFeature *feature,
9 \; T9 Q* t4 i5 K5 R3 o# N+ t
ProError status,
2 G$ ~1 a% Q$ ~/ g" l
ProAppData appdata)
1 O# |. I8 w2 c9 i& \& w. f
{
4 @4 {1 R) y( u. ?* t. A$ _- M
ProBoolean visible;
% Z; F% y+ O# Z5 c
vector<int> *fids = (vector<int> *)appdata;
- Y9 J( b3 h* @7 t; Y
ProFeatureVisibilityGet(feature,&visible); /* only work with visible features */
4 H' l% |8 [1 D* N; s( z/ A
if(visible == PRO_B_TRUE){ // and collect their ids
5 J: h7 U9 N, F# V( f* [8 }
fids->push_back(feature->id);
8 J9 e5 B2 _8 \! E: L, n8 ?" i+ M
}
/ g: ~. P$ ^* t2 R& b- n- Z
return(PRO_TK_NO_ERROR);
! v" V/ C7 u8 u, u" W3 j' u7 s
}
! j$ b0 H: c( D$ i" D* g& z, T0 C
vector<int> feat_ids;
% @9 x; ^, d8 u0 l0 p+ A
// the main Pro/TOOLKIT call
5 s7 e9 b6 G; ~
ProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。
& E( c0 k' X" E4 L: m) ]
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
4 Z" _: ^0 B, K; q
for(unsigned int i=0; i<feat_ids.size(); i++){
$ ~- C0 |" }) ~4 w
cout<<feat_ids
<<endl;
( X4 l5 N/ m' [2 q4 g
}
! K- E0 n; g9 p7 i Y
5 结束语
5 J; j7 O. u8 H. s/ n1 l
以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求
作者:
hdxpxp
时间:
2009-9-24 11:22
楼主对proe二次开发颇有见地,野火2.0以后,proe是不是只能用vc.net做开发了?不能用VC了。据说proe4.0引进了vb的接口,是不是也是.net而不是以前常说的VB?楼主用什么工具?很想在proe的基础上作些工具,就是不知道怎么下手.
欢迎光临 机械必威体育网址 (//www.szfco.com/)
Powered by Discuz! X3.4