一、前言 ,F*HZBNFZ
s: iBl/N}
Pro/ENGINEER是美国参数技术公司(PTC)研制的三维CAD/CAM软件,TOOLKIT是PTC专门提供的一个二次开发工具。在TOOLKIT中,PTC向用户提供了大型的C语言函数库,通过调用这些底层函数,用户能方便而又安全地访问Pro/ENGINEER的数据库及内部应用程序,进行二次开发,扩展一些特定功能。 3ZI:EZ5
.5AFAGv_c
作为一种成功的三维CAD/CAM软件,Pro/ENGINEER已经包含了比较高效的出图模块,可以适用于任何形状的零件出图任务,但是,对于一些零件较为类似、几何外形接近的出图要求来说,将大量的时间花在重复布置视图、标记尺寸上,是得不偿失的。在Pro/ENGINEER已有的出图模块基础上进行二次开发,则更适合此类情况。 hS*&p0YV~M
KFRf5^ %
目前,在很多设计部门中所设计的产品有一定相关性,这就使得很多设计过程存在重复劳动的问题。基于这种原因,在Pro/ENGINEER2000i2基础上,作者参与开发了一个较为完整的轴类零件设计(三维模型)、零件出图、零件加工(加工刀轨代码生成)系统,让一些通用的设计过程实现自动处理,以减轻设计人员的工作量(本文仅着重讨论其中的零件出图部分)。对于零件设计,该系统采用较为简单的族表方法(即预先手工构建产品模型,把它作为族表的类属件,然后在族表中定义各个控制参数来控制模型的形状大小,并在程序中通过改变各个参数的值来得到所需要的衍生件)。对于零件出图部分的程序设计,就可以十分方便地根据前面零件设计中定义的参数名称来获得相应的轴类零件形状及尺寸信息。 *]}F=dtR k
X
@pm !c#
二、视图生成方法分析 54B`T/>R:E
+>%51#2.Q
1.图纸区域划分 6 !?]
(
+0j{$MPZ
为了避免在图纸自动生成的过程中产生视图间干涉、尺寸重叠等现象,可以事先按要求将图纸划分出特定区域。对于结构较为相似、几何外形不太复杂的轴类零件,可以将整个图纸分成主视图区、剖面图区、表格区及注释区。然后根据所确定的区域大小及位置,调节视图比例,生成较为合理的视图。这样就可避免图纸上视图及尺寸间的位置冲突。 4[&&E7]EX
UbGnU_}
2.生成主视图及剖面图 N-t"CBTO
kM[!UOnC!<
生成视图的关键是确定视图方向以及视图的比例。对于视图方向,如果方向选择错误,则无法正确表达零件的形状。在TOOLKIT提供的生成主视图(General View)的函数中,可以通过输入不同的方向矩阵(Orientation Matrix)来调整视图方向。对于视图比例,选择恰当的比例系数,可以使视图尽可能表达清楚,又不会造成越界,产生区域干涉。 [La}h2gz
US=K}B=g
对于轴类零件,由于特定的外形特征,在生成图纸时除了主视图外还需生成各键槽处的剖视图。通过调用TOOLKIT提供的视图生成函数ProDrawingGeneral Q`NdsS2
%IE;'aa
}
viewCreate(),可以方便地生成需要的视图(需要注意:在零件模型设计阶段就确定恰当的默认参考平面,这样可以在出图阶段忽略考虑方向的问题,即方向矩阵可用单位矩阵代替;视图比例先默认为1:1)。在此基础上,调用TOOLKIT提供的视图轮廓提取函数ProDrawingViewOutlineGet(),计算此视图的轮廓大小,再根据事先划分好的区域大小,重新设定视图比例,自动生成大小合适的视图。 j%D{z5,nKm
XT*/aa-1'
3.视图生成实例及程序 o3eaNYa
.{ZJywE<
在这个实例中,根据已生成的轴模型实体(axis.part),采用C语言编程,调用TOOLKIT提供的视图生成及调整函数,生成符合要求的图纸,并在此之上生成视图。程序如下: 2+?W{yAEi
`rK@> -
ProSolid solid; IW>~Yl?
r> Xk1~<!
int sheet; sa _J6~
KATf9-Sz
ProMdlCurrentGet(&solid);//获得内存中打开的轴模型 2y|n!p
T
W}"tf
L8
ProStringToWstring(wroot, “drawing”); eM5-v-
P;-.\VRu
ProObjectwindowCreate(wroot,PRO_DRAWING,&w_id);//打开名为drawing的空视图窗口 Fw{68ggk
a(*"r:/lD
ProDrawingCurrentSheetSet(drawing, sheet);//设置当前图层 ~l?c.CSd
%'=2Jy6h
ProDrawingSolidAdd(drawing, solid);//将获得的轴模型加入当前窗口 ixK9/5T
m+:JNgX6
ProWindowActivate(w_id);//激活当前窗口 h-sO7M0E]
c0HPS9N\
ProDrawingGeneralviewCreate(drawing,solid,sheet,0,pos,scale,matrix,&view); //在当前图层上生成视图,其中比例大小scale=1.0,方向矩阵matrix为3Χ3单位矩阵 jUl_ToX
avM8-&h
ProDrawingViewOutlineGet(drawing,view,outline);//获得视图轮廓大小 mxBx?xM-
0v9i43[S|J
……………. :?LNP3}
98| v.d
//调整scale大小 _?y3&4N)
~3%\8,0
ProDrawingViewDelete(drawing,view,1);//删除不合理的视图 \kf
n,m
US^%pd
ProDrawingGeneralviewCreate(drawing,solid,sheet,0,pos,scale,matrix,&view);//按照调整的比例大小scale重新生成视图 2hso6Oy/v{
hO{&bY0
ProDwgSheetRegenerate(drawing,sheet);//刷新窗口,重新显示生成的视图 gR
gB=
C{
8z7eL>)
三、显示尺寸方法分析 {dP6fr1z
ZR%$f-
在Pro/ENGINEER中,实体模式(part mode)存储的尺寸和在制图(drawing)中创立的尺寸是不同的概念,因此要显示零件的尺寸就有以下两种方法可以实现。 2TQZu3$c
iPY)Ew`Im
1.在制图模式中生成新的尺寸 KHx;r@{<
v@ qDR|?^
在TOOLKIT中提供了尺寸生成函数ProDrawingDimCreate(),应用该函数可以生成各种尺寸。但是,该函数要求输入较多的入口参数,包括图纸模型(Drawing)、尺寸基准(Dimension Attachments)、尺寸类型(ProDimSense)、标注文本定位点(Dimension Text Location)等。 {QmK4(k?|c
nUVk;0at
2.在制图模式中直接显示实体模型中存储的尺寸 n%RaEL
&OE-+z
在TOOLKIT中提供了尺寸显示函数ProDimensionShow(),应用该函数可以在制图模式中有条件地显示实体模型中存储的各种尺寸,这也是Pro/ENGINEER制图模块中默认的显示模型尺寸的方法。相比较而言,这种显示尺寸的方法更简单适用,而且根据面向加工的设计思想(DFM),可以在设计阶段即实体造型阶段就考虑到加工,使得实体模型中存储的尺寸信息满足加工需求,即满足在出图时对尺寸显示的要求。 m\CU,9;;(
,quUGS
3.尺寸显示实例及程序 ^c9_ F9N
%Ie,J5g5
在此实例中,选择第二种尺寸显示方法。 R
>SZE"
s]`6uyW"
ProSolid solid; f%1\1_^g
Anpp`>}N
ProSolidDimensionVisit(solid,-1, (ProDimensionVisitAction)DimVisitAction01, trjeGSt&
:w
Y%=
(ProDimensionFilterAction)DimVisitFilter01, Z%LS{o~LK.
5D?{dA:Rq
(ProAppData)&p_data);//遍历实体模型中的各种尺寸 ]Ol
w6W?%
+t1+1Zv
ProError DimVisitAction01(ProDimension *dimension,ProError status,data *p_data) ,'t&L]
bG* l_
//尺寸处理函数 uPN^o.,/.
C`3XOth
{ &'i>d&
*SI,K)BP
ProDimensionShow(dimension,p_data->p_view,p_data->p_drawing,NULL); Pg`+Q^^6S
c&%3k+j
//尺寸显示 ubsv\[:C
fhRu-
ProDrawingDimensionPosGet(p_data->p_drawing,dimension,location); }?Pa(0=U
)+hJi/g
//获得默认标注文本位置 $sb@*K}:4
>Wx9a"H^(
ProDrawingDimensionMove(p_data->p_drawing,dimension,location_new); uh#E^~5S
{|j-e{*
//移动标注文本到指定位置 V4CA*FEA
Mh3L(z]/E
} sAs`O@
Au/'|%2#(
ProError DimVisitFilter01(ProDimension *dimension)//尺寸遍历过滤函数 nehk8+eV_
.wWf#bB
{ Z\QNn
wt'"<UN
status = ………….; 0$Zh4Y
9^ C6ZgNS
//设置不同的过滤条件,使得不同类型的尺寸可以对应不同的处理函数 p14$XV
:
4lR`%
return (status); A,4}
$-7
[AD%8H
} 'Cz]p~oF
e$Y7V
四、注释生成实例与程序 ?vF8 y;Jh
x2l}$(7
在TOOLKIT中,注释是以文本行(Note Line)为最小的存储单元的,不同的文本行组成一个注释块(Note Data),对于这些注释块,调用函数ProDtlnoteCreate()就可以生成注释,并在图纸的任何位置处显示出来。对于显示的字符可以通过设置不同的参数来改变它的颜色,字体以及倾斜度。实例中,通过调用用户自定义的注释生成函数UsrNoteCreate(),在图纸上生成轴的技术要求等信息。具体函数如下: |pU>^
FOPmvlA\-<
UsrNoteCreate() (5y*Btd=
}095U(@
{ |\"%Dy[m
K&dc< 4DC
ProDtlnote note; K7(GdKZe
X.q#ZpK
ProDtlnotetextHeightSet(text, height); U}=H1f,
xs"\c7pC
ProDtlnotetextWidthSet(text, -1.0); bZQ_j#{$
eSMno_Gt3
ProDtlnotetextSlantSet(text, 0.0); //设置注释字体的高、宽、倾斜度 LA6Ik_-F
CJ#Yu3}
ProDtlnotetextThicknessSet(text, 0.0);//设置字体粗细 xBw ua;
lfwBUb
ProStringToWstring(font, 襢ont?; SokU9n!
{@-tRm&
ProDtlnotetextFontSet(text, font); //设置字体类型 )D]LPCd[
5:EE%(g9
ProStringToWstring(wstr, note_text); //note_text中存储需要显示的字符串 )^E6VD&6
f|yq~3x)
ProDtlnotetextStringSet(text, wstr); REk^pZ3B
XFww|SG$
ProDtlnotelineAlloc(&line); Fy_~~nI0
IY(;:#l
ProDtlnotelineTextAdd(line, text); //为文本行分配存储空间 :ZM=P3QZ
,qdZ6bv,]|
ProDtlnotedataAlloc(drawing, &ndata); j2n
4; m
~%: TE}
ProDtlnotedataLineAdd(ndata, line);//为⑹头峙淇占洌?⒓尤胛谋拘? ProDtlnotedataAngleSet(ndata, angle) ; |l?*' =
@XKVdtG
ProDtlattachAlloc(PRO_DTLATTACHTYPE_FREE,NULL, pos_note, NULL, &attach); ;b,
bHL
,/Y$%.Rp
ProDtlnotedataAttachmentSet(ndata, attach); f_QZql
cavzXz
ProDtlattachAlloc(PRO_DTLATTACHTYPE_PARAMETRIC, NULL, NULL, surf_sel, a -5#8
l~*d0E-$
&leader); AAc2u^spx
).$kp2IN
ProDtlnotedataLeaderAdd(ndata, leader); oR<;Tr~{q
N$8"X-na ?
ProDtlnoteCreate(drawing, NULL, ndata, ¬e); 6b4]dvl_
r`:dUCFE
ProDtlnoteShow(¬e);//最终生成注释,并显示其中的字符串 M:K4o%
o-]8)G>~M
ProDtlnotedataFree(ndata);//释放前面所分配的内存空间 Mgu=cm)
.ldBl
Return(); ob(~4H-
TIP H#W:v
} hXn@vK6
9z?B@;lMc
五、其他特殊符号的生成方法 kjR-p=}
[8`^_i=#
TOOLKIT提供了最基本的二维图形生成函数ProDtlentityCreate(),它的生成方法和文本注释的生成方法类似。通过调用圆弧初始化函数ProArcdataInit()或者直线初始化函数ProLinedataInit(),可以很容易地画出直线或者圆弧曲线。以圆弧生成为例,程序如下: #w)D ml
Otm7j>w
UsrCircleentityCreate() sRGIHT#
z8w@pT
{ 0 9*?'^s4
H^w Inkf>
ProVector start_pos,end_pos; M 0RVEhX
4p`z%U~=u
double start_angle, end_angle,start_angle ,end_angle ; IeE6?!,)
*3!ixDX[r
ProDtlentitydataAlloc(drawing, &edata);//分配图元存储空间 "& q])3h =
zLV k7u{e
ProCurvedataAlloc(&curve); //分配圆弧存储空间 6C*4' P9>
xO'xZ%cUI
ProArcdataInit(start_pos,end_pos,center,start_angle,end_angle,radius,curve);// 圆弧的初始化:设置起点,终点,起始角度,中止角度以及半径 ",Fqpu&M
6b=7{nLF
ProDtlentitydataCurveSet(edata, curve); xy<)zKp
s!K9-qZl<
entity_color.method = PRO_COLOR_METHOD_TYPE; TZ@S?r>^
@>hXh
+!2h
entity_color.value.type = color; )'t&LWS~
P;lDri
ProDtlentitydataColorSet(edata, &entity_color);//设置圆弧的线型颜色 T#R*]
EcmyY,w
ProDtlentityCreate(drawing, NULL, edata, entity);//生成圆弧 TInp6w+u
w<=-n;2
ProDtlentitydataFree(edata);//释放内存空间 x?-kt.M
si>gYO
return (); V%!my[b
CK RnkTTiV
} e!O:z
U~[ tp1Z)
借助于以上图形生成函数,可以生成一些特殊符号或者简单的剖面图形。在实例中,应用这种方法来实现粗糙度、同轴度及平行度等的标注。 1FmqNf:V7I
CjlA"_!%E
六、程序运行 $3 ~/H"K
X0gWTs
在Pro/ENGINEER环境中要运行用户自己的应用程序(可执行exe文件或动态链接库dll文件),必须在Pro/ENGINEER中对该程序进行注册。在Pro/ENGINEER安装目录下的toolkit子目录中有个Protk.dat文件,这就是一个标准的注册文件,用户只需按照实际情况简单更改就可以生成自己的注册文件。 \"hP*DJ"
++M%PF [
{
程序如下: )u(Dq u\t
:jioF{,
NAME drawing_application //应用程序名称 I r;Z+}4>Y
q#!c6lG
EXEC_FILE ./$PRO_MACHINE_TYPE/obj/drawing_application.exe //用户编写的可执行程序 &Kc'g H
T6p2=o&p
TEXT_DIR ./protk_appls/pt_install_test/text // 7
`& NB]
t_ZWd#x+;
STARTUP exe p3z%Y$!Tm
^6I8 a"
REVISION 18 %W]"JwRu
QDJ:LJz\
END $79-)4;z4
_i+7O^=d6X
有了注册文件之后,可在Pro/ENGINEER的AuxiliaryApplication对话框中加载该注册文件,以运行指定的应用程序,也可以将该注册文件放到Pro/ENGINEER的启动目录中,这样每次运行Pro/ENGINEER,都会自动加载这个文件,并运行指定的应用程序。 -
-H%FYF`
?{*/VJl$
七、结束语 uNRT@@oCq
14;lB.$p
本文详细讨论了基于Pro/ENGINEER平台的零件工程图纸生成软件中零件视图、尺寸、注释等的自动生成方法,并通过编写C语言程序调用二次开发工具TOOLKIT提供的相关函数,具体实现了Pro/ENGINEER平台上轴类零件工程图纸的自动生成,从而改变了传统的人工出图方式,极大提高了设计人员的工作效率。