机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 2613|回复: 1
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2008-8-6 14:00:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1 前言    Pro/TOOLKIT是Pro/ENGINEER的一个应用程序接口(API),其的编程语言是C 语言,它可以对Pro/ENGINEER进行功能扩展,满足PTC客户的特定需求。而且,Pro/TOOLKIT提供了定制标准Pro/ENGINEER用户界面的能力,自动执行重复性的程序,通过Pro/ENGINEER集成的内部程序(Dll)或外部应用程序(Exe)可以为造型用户提供自定义的应用程序、设计规划和绘图自动化。$ g/ b: Y) Q' w: C( T6 f, H% g/ U# A
2 Pro/TOOLKIT编程条件和工具
( M: d, W3 `( t* N4 U( d! C. R. \7 J    知道如何写C程序,就已经具备了使用Pro/TOOLKIT的条件,应该能够理解指针,当把数据从一个函数传到另一函数时,将经常使用到它。Pro/TOOLKIT帮助,包含2000多个函数,并且可以通过例子代码学习如何使用。除此之外,如果想解决几何学问题,还需要对失量理论有一定的了解。
+ x* B1 w8 `! W3 Pro/TOOLKIT程序中的结构体. I" p4 [* M( \- z9 [* G
    Pro/TOOLKIT都是用C语言编写的,每个对象都用结构体来描述,因此需要了解对象是如何使用的。为了使用结构体,需要定义它,Pro/TOOLKIT提供许多“typedefs”,这些typedefs只不过是Pro/ENGINEER结构体的伪指令。例如:
( `& ^/ R8 E& d" j( }/ q+ vtypedef struct entity* ProPoint;6 L0 O2 z, i) @0 x  Y+ ?
typedef struct sld_part* ProSolid;# `( ~- r" u2 C5 e  M
    这些也叫做OHandles (from Opaque handles),在Pro/ENGINEER中它们直接获得对象的内存地址。在某些情况下,这样做可能是危险的,因此PTC提供了另外一种结构体类型,它只包含Pro/ENGINEER的内部数据库中项目的必要信息。这种结构体(labeled DHandle from data handle)是一种类的结构,它包括对象的类型、ID等。许多函数命令都和下面的结构体相联系。
* L. q5 s! F# l# q* ftypedef struct pro_model_item
, f1 x) j; N6 i+ s6 x  ?$ P{
# p! Y) O) Y- z- Q' BProType type;3 b9 b, K4 Y* i4 c
int id;
5 E4 d3 S5 b- k! S: N: OProMdl owner;
$ R0 M, u5 B2 g0 m5 g6 Q}ProModelitem,ProGeomitem,ProExtobj, ProFeature,ProProcstep,ProSimprep,ProExpldstate,5 i3 B* f4 I5 V6 u
ProLayer,ProDimension,ProDtlnote,ProDtlsyminst,ProGtol,ProCompdisp   
" }! j4 }4 |- |7 O# E& T9 G . p+ Z+ s: u1 d+ [; a: c
    如果处理几何问题,要用到ProModelitem、ProGeomitem 和ProFeature这几个结构体。. y- a, l! ]4 F' e  ?
4 Pro/TOOLKIT中的常用函数及使用& x! M: v5 Y) t0 P+ P% C% j
    需要了解的第一个函数是ProMdlCurrentGet()。在Pro/TOOLKIT帮助中其描述如下。
& S) A" x: y% _. C' S7 _! D2 Q) yDescription$ @4 H+ w8 ^6 w+ ?& `
Initializes the p_handle with the current Pro/ENGINEER object.
' z. C) w" x8 {" ?$ fSynopsis
6 p1 Q+ V: T9 C. h#include <ProMdl.h>2 \) C8 X+ Q" q# f" Z4 V3 M6 O6 B
ProError ProMdlCurrentGet (. I( V3 e# q; H
ProMdl *p_handle; q! y, }+ A. }5 c/ Y% o
/* (Out)
% `2 d; x, {3 ]+ C) e" n* JThe model handle3 N2 E  {1 j: T
*/' \; q1 @4 K2 x1 D
)+ t/ k4 n- m$ N
这个函数包含一个参数-指针型参数,定义及使用方法如下。" n- F: y1 P2 C" Q* R
ProMdl mdlhandle;2 u+ ]% g; a7 x
ProMdlCurrentGet(&mdlhandle);6 {- J& l8 T$ S
mdlhandle 是Ohandle型参数 ,能用这个对象做许多事情。例如,能用ProMdlDataGet()做一个调用并且获得关于这个模型的一些初始信息。
* R4 D( g, e* I$ h0 }7 p' ~4 J: kProMdldata mdldata;9 Y: D5 c: h6 R
ProMdlDataGet (mdlhandle, &mdldata);$ W1 v" R  D0 d
    mdldata是一个简单的结构体,包括名称、类型、路径和关于模型的一些其他信息。下面打印这个模型的类型。- n2 k5 L) {8 B/ G1 j- I- Y
    不能直接执行printf("%s\n",mdldata.type),需要采用下面的方式,用ProWstringToString()把这种类型转成一种规定的字符序列:
8 q$ B& ~7 y) w6 Ychar type_in_c[PRO_TYPE_SIZE]; /* uses predefined Pro/T constants like PRO_TYPE_SIZE */
: e2 j/ f1 x3 Z  O  `) ~1 e  JProWstringToString (type_in_c, mdldata.type);
7 k/ U5 w5 v# |printf("%s\n",type_in_c);* U; S% |0 y# m
    现在打印模型的名字,就能象上面一样,从mdldata结构中取出名字,也可以用另一种的方法。
" L8 v: U2 Q" V% g9 AProName current_name;
% H" y  ]) R( nchar current_name_in_c[PRO_NAME_SIZE]; 2 a, g( k' o8 M, B  ~
ProMdlNameGet(mdlhandle, current_name);
' z. R9 D1 ]" ?" [5 F% W* Z3 g) eProWstringToString(current_name_in_c,current_name);
( z$ P. _6 m" K$ kprintf("%s\n", current_name_in_c);. W* z- [1 J6 S% c& H5 ?
    接着,我们看一下访问函数。模型可能有大量包含许多子对象的对象。由于不知道这些对象的数量,需要能够以某种方式收集要寻找的对象。对于这种类型的问题,需要用到PTC提供的访问函数。
" E- i( ]* Z) W2 L" A    假设想访问包含在一个模型中的所有特征并收集它们的ids。执行这个指令的函数是ProSolidFeatVisit()。其包括4个参数: ProSolid句柄、访问函数指针、过滤函数指针和应用数据的结构体指针。过滤函数的目的是能够过滤特定的对象,请看下面的例子:
, P0 V8 U1 p+ Estatic ProError user_action_get_feat_ids(6 {2 ~& _5 w% m
ProFeature *feature,
% p  C" j3 g/ a' ~; \ProError status,$ ?5 `- j+ Y( u! d- K
ProAppData appdata)
9 l) u2 E0 j4 p2 J{( A$ [* p% \1 P5 h" l
ProBoolean visible;
; m6 d! ?+ j1 u* H& r2 Jvector<int> *fids = (vector<int> *)appdata;4 ^; i0 l' Q0 t
ProFeatureVisibilityGet(feature,&visible); /*  only work with visible features */9 D: n, p1 K2 ]: e( X0 I0 Z0 e% h4 j
if(visible == PRO_B_TRUE){ // and collect their ids
$ n" X& e- \4 {  }, Ofids->push_back(feature->id);
( D  o$ }4 n% l) y1 q( @/ E}
, s  n4 b# s2 s- _return(PRO_TK_NO_ERROR);
6 M1 U0 b& K0 Y4 M) b }
, P" o8 {$ ^7 z! G: U/ Xvector<int> feat_ids;! w7 j+ h4 M+ Q+ I, S
// the main Pro/TOOLKIT call
, p6 h- \" d- AProSolidFeatVisit((ProSolid) mdlhandle,(ProFeatureVisitAction)user_action_get_feat_ids,NULL,(ProAppData)&feat_ids) ;注意前面提到的mdlhandle的使用,在函数调用中ProMdl 和 ProSolid能相互变换。还要注意,对于不想使用的过滤函数,赋该参数值为NULL。* A4 D( X* R2 K; f6 q
现在在feat_ids中获得一系列ids,这样就能使用它们执行一些任务,例如把它们打印出来:
% D( S& z' _( T3 s1 Y3 I# Z. Ufor(unsigned int i=0; i<feat_ids.size(); i++){
: P$ @2 e( }- `# qcout<<feat_ids<<endl;- @, D/ P2 Z6 }1 t: f" G' w% Q  j
}# E6 U( G" ~, a$ l: Z
5 结束语+ H8 e* U" D) D1 u$ w3 M3 j0 A
    以上提到的是需要学习Pro/TOOLKIT最基本、最常用的概念。建议学习这些例子时,可以不断变化的进行实验。另外,通过学习Pro/TOOLKIT帮助中的实例,不断深入理解大量的函数,学会其使用方法,逐步开发出用户需要的Pro/ENGINEER外挂模块,以满足特殊用户的需求
回复

使用道具 举报

2#
发表于 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:08 , Processed in 0.076892 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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