不是美女 |
2008-10-23 11:53 |
基于Pro/E平台的工程图纸自动化生成软件的开发
一、前言 pn"TFapJA .\)`Xj[? Pro/ENGINEER是美国参数技术公司(PTC)研制的三维CAD/CAM软件,TOOLKIT是PTC专门提供的一个二次开发工具。在TOOLKIT中,PTC向用户提供了大型的C语言函数库,通过调用这些底层函数,用户能方便而又安全地访问Pro/ENGINEER的数据库及内部应用程序,进行二次开发,扩展一些特定功能。 5^lFksZ R<(kiD\?] 作为一种成功的三维CAD/CAM软件,Pro/ENGINEER已经包含了比较高效的出图模块,可以适用于任何形状的零件出图任务,但是,对于一些零件较为类似、几何外形接近的出图要求来说,将大量的时间花在重复布置视图、标记尺寸上,是得不偿失的。在Pro/ENGINEER已有的出图模块基础上进行二次开发,则更适合此类情况。 wzX(]BG }9=X*'BO 目前,在很多设计部门中所设计的产品有一定相关性,这就使得很多设计过程存在重复劳动的问题。基于这种原因,在Pro/ENGINEER2000i2基础上,作者参与开发了一个较为完整的轴类零件设计(三维模型)、零件出图、零件加工(加工刀轨代码生成)系统,让一些通用的设计过程实现自动处理,以减轻设计人员的工作量(本文仅着重讨论其中的零件出图部分)。对于零件设计,该系统采用较为简单的族表方法(即预先手工构建产品模型,把它作为族表的类属件,然后在族表中定义各个控制参数来控制模型的形状大小,并在程序中通过改变各个参数的值来得到所需要的衍生件)。对于零件出图部分的程序设计,就可以十分方便地根据前面零件设计中定义的参数名称来获得相应的轴类零件形状及尺寸信息。 0>{&8: q9+`pj 二、视图生成方法分析 W;L<zFFbU) '^mCLfo0} 1.图纸区域划分 st4z+$L @>:V? 为了避免在图纸自动生成的过程中产生视图间干涉、尺寸重叠等现象,可以事先按要求将图纸划分出特定区域。对于结构较为相似、几何外形不太复杂的轴类零件,可以将整个图纸分成主视图区、剖面图区、表格区及注释区。然后根据所确定的区域大小及位置,调节视图比例,生成较为合理的视图。这样就可避免图纸上视图及尺寸间的位置冲突。 {o>51fXc) /Q]6"nY 2.生成主视图及剖面图 q~:H>;:G- p}}pq~EH/ 生成视图的关键是确定视图方向以及视图的比例。对于视图方向,如果方向选择错误,则无法正确表达零件的形状。在TOOLKIT提供的生成主视图(General View)的函数中,可以通过输入不同的方向矩阵(Orientation Matrix)来调整视图方向。对于视图比例,选择恰当的比例系数,可以使视图尽可能表达清楚,又不会造成越界,产生区域干涉。 ;|yd}q=p z3-A2#c 对于轴类零件,由于特定的外形特征,在生成图纸时除了主视图外还需生成各键槽处的剖视图。通过调用TOOLKIT提供的视图生成函数ProDrawingGeneral ?OjZb'+=K Odn`q= viewCreate(),可以方便地生成需要的视图(需要注意:在零件模型设计阶段就确定恰当的默认参考平面,这样可以在出图阶段忽略考虑方向的问题,即方向矩阵可用单位矩阵代替;视图比例先默认为1:1)。在此基础上,调用TOOLKIT提供的视图轮廓提取函数ProDrawingViewOutlineGet(),计算此视图的轮廓大小,再根据事先划分好的区域大小,重新设定视图比例,自动生成大小合适的视图。 M9~eDw'Pr ;[nomxu|? 3.视图生成实例及程序 96ydcJY0' ;@ <E 在这个实例中,根据已生成的轴模型实体(axis.part),采用C语言编程,调用TOOLKIT提供的视图生成及调整函数,生成符合要求的图纸,并在此之上生成视图。程序如下: /6fa
7; WzinEo{f ProSolid solid;
]F'o >;qAj!' int sheet; Q+<{2oVz &JUHm_wd&S ProMdlCurrentGet(&solid);//获得内存中打开的轴模型 :<}1as!eo [KcF0%a ProStringToWstring(wroot, “drawing”); "%zb>`1s IN^dJ^1+ ProObjectwindowCreate(wroot,PRO_DRAWING,&w_id);//打开名为drawing的空视图窗口 QH>e_ U~CG(9 ProDrawingCurrentSheetSet(drawing, sheet);//设置当前图层 Xmb001 sh#hDU/</ ProDrawingSolidAdd(drawing, solid);//将获得的轴模型加入当前窗口 EN2H[i+, -tPia=^ ProWindowActivate(w_id);//激活当前窗口 npCiqO !#[B#DZc( ProDrawingGeneralviewCreate(drawing,solid,sheet,0,pos,scale,matrix,&view); //在当前图层上生成视图,其中比例大小scale=1.0,方向矩阵matrix为3Χ3单位矩阵 6[x6:{^J JX)%iJq# ProDrawingViewOutlineGet(drawing,view,outline);//获得视图轮廓大小 ^QG;:.3v XfZ^,'z ……………. l@W1bS aw\0\'} //调整scale大小 (_0r'{` /}\Uw ProDrawingViewDelete(drawing,view,1);//删除不合理的视图 `*Ju0)g1 ?+P D?c7 ProDrawingGeneralviewCreate(drawing,solid,sheet,0,pos,scale,matrix,&view);//按照调整的比例大小scale重新生成视图 U0m 5Rc 0FAe5
BE7
ProDwgSheetRegenerate(drawing,sheet);//刷新窗口,重新显示生成的视图 :aHLr[%Mz Ss~yy0 三、显示尺寸方法分析 \cx==[&( xg.o7-^M 在Pro/ENGINEER中,实体模式(part mode)存储的尺寸和在制图(drawing)中创立的尺寸是不同的概念,因此要显示零件的尺寸就有以下两种方法可以实现。 ']&rPvkL FW@(MIH 1.在制图模式中生成新的尺寸 VN/v] wZnv*t_ 在TOOLKIT中提供了尺寸生成函数ProDrawingDimCreate(),应用该函数可以生成各种尺寸。但是,该函数要求输入较多的入口参数,包括图纸模型(Drawing)、尺寸基准(Dimension Attachments)、尺寸类型(ProDimSense)、标注文本定位点(Dimension Text Location)等。 OD8{
/7 3:g~@PB 2.在制图模式中直接显示实体模型中存储的尺寸 =O
o4O CF2 u*6Y>_iA 在TOOLKIT中提供了尺寸显示函数ProDimensionShow(),应用该函数可以在制图模式中有条件地显示实体模型中存储的各种尺寸,这也是Pro/ENGINEER制图模块中默认的显示模型尺寸的方法。相比较而言,这种显示尺寸的方法更简单适用,而且根据面向加工的设计思想(DFM),可以在设计阶段即实体造型阶段就考虑到加工,使得实体模型中存储的尺寸信息满足加工需求,即满足在出图时对尺寸显示的要求。 #d* )W3e2{ /idrbc 3.尺寸显示实例及程序 \- f^C}m h0z>dLA#2 在此实例中,选择第二种尺寸显示方法。 $8{v_2C){ ozOvpi:k3% ProSolid solid; PRi1 `%d
wa%;'M& ProSolidDimensionVisit(solid,-1, (ProDimensionVisitAction)DimVisitAction01, ""W*) rR
b?]Lx.l- (ProDimensionFilterAction)DimVisitFilter01, D.ERt)l> U9t-(`[j? (ProAppData)&p_data);//遍历实体模型中的各种尺寸 0`Hr(J`F ;r3Xh)k; ProError DimVisitAction01(ProDimension *dimension,ProError status,data *p_data) f=--$o0U~ 7^FJ+gN8b //尺寸处理函数 /'QfLW>6 9g~"Y[ ] { :~wU/dEEiz ^~DDl$NH ProDimensionShow(dimension,p_data->p_view,p_data->p_drawing,NULL); > }fw7 X u`
L9Pj&v //尺寸显示 n\w2e_g;N ;6655C ProDrawingDimensionPosGet(p_data->p_drawing,dimension,location); b^^ .$Gu xe@11/F //获得默认标注文本位置 8<:.DFq O.z\
VI2f ProDrawingDimensionMove(p_data->p_drawing,dimension,location_new); ,LodP%%UV 4apaUP=Jp //移动标注文本到指定位置 U+ANSW/ vAcxca">S } FNR<=M =-%10lOI ProError DimVisitFilter01(ProDimension *dimension)//尺寸遍历过滤函数 ?F"mZu [I6&|Lz> { f >$V:e([
yp?a7t M status = ………….; 6DT^:LHS []l2
`fS# //设置不同的过滤条件,使得不同类型的尺寸可以对应不同的处理函数 Nv5)A=6#AA A+41JMH return (status); \(`8ng]vs .I %`yhCW } AMre(lgh >m+Fm= 四、注释生成实例与程序 *bSxobn gZ@z}CIw' 在TOOLKIT中,注释是以文本行(Note Line)为最小的存储单元的,不同的文本行组成一个注释块(Note Data),对于这些注释块,调用函数ProDtlnoteCreate()就可以生成注释,并在图纸的任何位置处显示出来。对于显示的字符可以通过设置不同的参数来改变它的颜色,字体以及倾斜度。实例中,通过调用用户自定义的注释生成函数UsrNoteCreate(),在图纸上生成轴的技术要求等信息。具体函数如下: ?rxq//S2 SX]uIkw UsrNoteCreate() rsn^YC "I,=L;p { TD-o-*mO 952l1c! ProDtlnote note; h,zM*z A_ *ry}T= ProDtlnotetextHeightSet(text, height); hxZL/_n' h.jO3q ProDtlnotetextWidthSet(text, -1.0); 3eERY[ tA8O(9OV ProDtlnotetextSlantSet(text, 0.0); //设置注释字体的高、宽、倾斜度 )skz_a}]8 } /*U~!t ProDtlnotetextThicknessSet(text, 0.0);//设置字体粗细 b_Dd$NC * zt?y ProStringToWstring(font, 襢ont?; e!=~f%c<N 7 g|EqJ7 ProDtlnotetextFontSet(text, font); //设置字体类型 W <u,S #HTq\J! ProStringToWstring(wstr, note_text); //note_text中存储需要显示的字符串 Tfp^h~&u u';9zk/$ ProDtlnotetextStringSet(text, wstr); nArG
I}@ Ajm4q_ ProDtlnotelineAlloc(&line); 3I G<Ot9 D{rM ProDtlnotelineTextAdd(line, text); //为文本行分配存储空间 2EiE5@ 8/k"A-m ProDtlnotedataAlloc(drawing, &ndata); M(?0c}z Mp?L9 ProDtlnotedataLineAdd(ndata, line);//为⑹头峙淇占洌?⒓尤胛谋拘? ProDtlnotedataAngleSet(ndata, angle) ; C`=YGyj=TL iAo/Dnp2J ProDtlattachAlloc(PRO_DTLATTACHTYPE_FREE,NULL, pos_note, NULL, &attach); HCw,bRxm 2b
K1.BD ProDtlnotedataAttachmentSet(ndata, attach); k~*%Z!V}C *WfQi8 ProDtlattachAlloc(PRO_DTLATTACHTYPE_PARAMETRIC, NULL, NULL, surf_sel, dh_c`{9 ?$#P
=VK &leader); _tRRIW"Vx" GH \
Sy ProDtlnotedataLeaderAdd(ndata, leader); 8.:WMH` Y @Ur} ProDtlnoteCreate(drawing, NULL, ndata, ¬e); .(99f#2M:
]0XlI;ah ProDtlnoteShow(¬e);//最终生成注释,并显示其中的字符串 MK(~ [\qclW;L ProDtlnotedataFree(ndata);//释放前面所分配的内存空间 F+ %l=
fs bTt1y O Return(); HR;I}J 9 20# V?hX3 } !/e*v>3u& sC A 五、其他特殊符号的生成方法 Xe&p.v *-*SCA`E^= TOOLKIT提供了最基本的二维图形生成函数ProDtlentityCreate(),它的生成方法和文本注释的生成方法类似。通过调用圆弧初始化函数ProArcdataInit()或者直线初始化函数ProLinedataInit(),可以很容易地画出直线或者圆弧曲线。以圆弧生成为例,程序如下: us E%eF] On|b- UsrCircleentityCreate() }T-'""* >a&IFi,j {
C TKeY 6Yl+IP];i ProVector start_pos,end_pos; {isL< XZ@|(_Z double start_angle, end_angle,start_angle ,end_angle ; &M: | |