汽轮发电机关键部件的参数化设计方法

文档序号:6334386阅读:322来源:国知局
专利名称:汽轮发电机关键部件的参数化设计方法
技术领域
本发明涉及一种汽轮发电机关键部件的设计方法.
背景技术
汽轮发电机关键部件设计特征多、形状尺寸、位置尺寸、特征间的约束关系繁复, 设计过程耗时、出错率较高,但是对于不同功率的发电机,其部件的特征类型相似高,聚类 特性明显,适合进行参数化建模。以汽轮发电机转子线圈为例,线圈设计一般分为八匝线 圈,每匝线圈主要分为直线部分、转角部分、励端弧部、汽端弧部、配重线、极间连接线组 成,每匝线圈中的各个线圈上分布有多种形状的通风槽,定位孔,由于每匝线圈包含数量 多,且每个线圈上的通风槽和定位孔的形状和位置都不相同,重复工作量大,但成组特征明
Mo近十几年来,CAD三维造型软件已经成为现代企业进行产品设计的主流软件,产品 的数字化建模与仿真技术已经发展得比较成熟。但是在参数化造型方面有些问题一直没有 得到很好地解决。现有的参数化设计方法一般采用基于几何约束法,但是该方法将基本几 何特征间的约束都用统一的模型,可以适应较大范围的约束,但求解的效率低,处理过程的 几何直观性差,迭代法求解的稳定性也比较差,迭代的初值和步长的选取对求解的结果有 很大影响。模型越复杂、约束越多,约束方程组的规模就越大,越不易求解。

发明内容
本发明的目的是为解决现有的参数化设计方法一般采用基于几何约束法,但是该 方法将基本几何特征间的约束都用统一的模型,可以适应较大范围的约束,但求解的效率 低,处理过程的几何直观性差,迭代法求解的稳定性也比较差,迭代的初值和步长的选取对 求解的结果有很大影响。模型越复杂、约束越多,约束方程组的规模就越大,越不易求解的 问题,进而提供一种汽轮发电机关键部件的参数化设计方法。本发明的方法步骤如下一、对线圈的基本结构进行分解以模块化思想对线圈 中具有几何互换性和稳定几何结构的模块进行划分,分解出基本模块、通用模块和专用模 块三类;就线圈而言,基本模块包括线圈体模块和轴段本体;通用模块包括进风口模块和 槽型模块;专用模块包括通风孔模块、小鱼尾模块、大鱼尾模块和镜像孔。几何模块可进 一步分解,直线端部就可以分解为A 线圈本体;0:基点;B,C:通风槽;D,E 进风口四个基 本模块;二、面向对象的几何结构建模对已经划分的几何模块进行类描述,其中每个模块 的描述模板为Class几何特征体类名称{几何体对象名称;几何体对外约束对象Itag ;几何体对外约束对象2tag ;
3
......几何体对外约束对象ntag ;CreateGeometry (参数1,参数2,参数3) //创建自身模块几何特征整体,其拓扑结 构固定{返回几何体对外约束对象Itag ;几何体对外约束对象2tag ;......几何体对外约束对象ntag ;}////////////////////////////“创建几何特征体与其他对象的约束关系CreateParallel (外部约束对象tag,几何体对外约束对象i tag,平行距离);CreatePerpend (外部约束对象tag,几何体对外约束对象i tag);CreateAngle (外部约束对象tag,几何体对外约束对象i tag,角度);RemoveInterLine () ;//去除与几何体相交后在几何体内部的留存线条;......H其他约束创建方法}对于直线端部而言,所有模块都是四边形,其几何模块都是通过对四边形的约束 操作实现的。三、基于面向对象的几何约束法的零部件二维快速设计采用基于图论的约束 求解方法进行工程图的约束模型的求解;方法通过几何约束图(geometricconstraint graph)表示几何约束图,若定义图G= (V E)为约束图元素几何,则V代表几何元素集合 边,E代表几何元素之间的约束集合;方法首先将几何约束系统映射成几何约束图,然后从 基点开始进行约束图的有向化约束求解,而方法的关键是确定结构点的输出次序;约束求 解的起点是基点,所谓的基点就是位置相对不变的结构点;当用户添加几何约束或进行尺 寸修改时,系统会根据用户的设计意图把某一结构点确定为基点然后从基点开始沿着约束 边进行约束图的有向化;以直线端部二维参数化为例,其中A结构通过与基点0建立点重合 关系,固定A的位置,B, C结构通用与A建立中线重合和距离约束确定位置;D,E结构通过 与B和C建立角度和与A的距离约束确定位置。本发明的有益效果本发明的面向对象的几何约束法比其他二维参数化设计方法 具有结构清晰、计算量小,且几何特征定位准确。采用该方法提供的模板进行参数编程,程 序思路清晰、封装性好、运行效率高。本发明克服了现有技术中的不足之处而提出了面向对象的几何约束法,该方法继 承了传统几何约束法的全约束求解思想,但将其中的基本几何特征提升为专业领域相对固 定的几何结构,并将其中的各种约束形式采用函数进行封装,采用面向对象的思想进行布 图运算,避免了求解约束方程的复杂性,提高了布图效率和布图质量。


图1是汽轮发电机转子线圈结构示意图,
4
图2是汽轮发电机线圈本体结构示意图,图3是汽轮发电机直线端部结构示意图,图4是汽轮发电机槽型结构结构示意图,图5是汽轮发电机通风孔的结构示意图,图6是汽轮发电机小鱼尾的结构示意图,图7是汽轮发电机大鱼尾的结构示意图,图8是汽轮发电机镜像孔的结构示意图,图9是汽轮发电机线圈直线端部二维工程图,图10是创建矩形本体的示意图,图11是创建平行四边形本体的示意图,图12是直线端部结构图,图13是有向约束图,图14是线圈大矩形A绘制图,图15是通风槽小矩形B绘制图,图16是通风槽矩形B和线圈矩形A水平中心线重合约束;通风槽矩形B和线圈矩 形A左边共线约束示意图,图17是通风槽矩形C绘制图,图18是通风槽矩形C和本体矩形A水平中心线共线约束;通风槽矩形C和本体矩 形A左边平行且距离矩形1左边距离为74mm的示意图,图19是创建进风口平行四边形D的示意图,图20是进风口平行四边形D上边和本体矩形A上边共线约束示意图,图21是进风口平行四边形D左边与本体矩形A左边距离约束L = 25. 74mm的示 意图,图22是创建进风口平行四边形E的示意图,图23是进风口平行四边形E的top边和本体矩形A的top边共线约束的示意图,图24是进风口平行四边形E距离本体矩形A左边水平平移距离M = 88. 26mm的 示意图,图25和图26是进风口平行四边形D的左边和右边为边界修剪通风槽矩形B的上 边示意图,图27是进风口平行四边形E的左边和右边为边界修剪通风槽矩形B的上边示意 图,图28是删除平形进风口四边形D和E的水平中心线。本体矩形A、通风槽矩形B、 通风槽矩形C的竖直中心线示意图。
具体实施例方式本实施方式较佳的实施方式见图1 图28,本实施方式的方法步骤如下一、对线圈的基本结构进行分解以模块化思想对线圈中具有几何互换性和稳定 几何结构的模块进行划分,分解出基本模块、通用模块和专用模块三类;就线圈而言,基本 模块有线圈体模块,轴段本体等;通用模块包括进风口模块、槽型模块;专用模块包括通风孔模块、小鱼尾模块、大鱼尾模块和镜像孔(见图2 图8),对于直线端部而言,其二维图 纸如图9所示,几何模块还可进一步分解为A 线圈本体;0 基点;B,C 通风槽;D,E 进风 口四个基本模块;二、面向对象的几何结构建模对已经划分的几何模块进行类描述,其中每个模块 的描述模板为Class几何特征体类名称{几何体对象名称;几何体对外约束对象Itag ;几何体对外约束对象2tag ;......几何体对外约束对象ntag ;CreateGeometry (参数1,参数2,参数3) //创建自身模块几何特征整体,其拓扑结 构固定{返回几何体对外约束对象Itag ;几何体对外约束对象2tag ;......几何体对外约束对象ntag ;}////////////////////////////“创建几何特征体与其他对象的约束关系CreateParallel (外部约束对象tag,几何体对外约束对象i tag,平行距离);CreatePerpencK外部约束对象tag,几何体对外约束对象i tag);CreateAngle (外部约束对象tag,几何体对外约束对象i tag,角度);RemoveInterLine () ;//去除与几何体相交后在几何体内部的留存线条;......//其他约束创建方法}对于模块几何特征整体建模,由于其内部几何拓扑结构稳定、组合性弱,主要是固 化内部结合约束关系,其内部的扩展只是几何尺寸的改变,几何结构不发生改变。但是每次 生成新的模块几何形状后,其提供给其他模块相约束的几何标识发生改变,因此需要返回 新的约束标识。每个模块内部建立了与约束标识存在几何约束关系时几何模块整体定位的 过程函数,在计算时认定外部约束对象为固定,即只移动、旋转几何模块保证约束关系。每 个几何模块的约束关系函数不同,可根据零部件的特点具体增减。对于直线端部而言,所有模块都是四边形,因此其几何模块都是通过对四边形的 约束操作实现的,按照模板编写的代码为Class Rect//几何结构类名称是矩形{struct MyRect //矩形对外约束类型结构体{tag_t Left ;0088]tag—t Right ;0089]tag—t Bom ;0090]tag—t Top ;0091]tag—t HC;//水平中心线0092]tag—t VC■J!竖直中心线0093]double Point—A[3];0094]double Point—B[3];0095]double Point_C[3];0096]double Point—D[3];0097]};0098]Il创建矩形本体,以左下角点,长度和宽度作为输入值。返回外部约束上0099]边TOP,下边Β0Μ,左边,Left,右边Right,竖直中心线VC和水平中心线0100]HC0101]MyRect CComDraw:CreateRect(double LeftBomPoint[], double Length,0102]double Width)0103]{0104]MyRect RectInfor ;0105]CComDraw draw ;0106]Rectlnfor.Point_A
==LeftBomPoint
;0107]Rectlnfor.Point_A[l]==LeftBomPoint[1];0108]Rectlnfor.Point_A[2]==LeftBomPoint[2];0109]Rectlnfor.Point_B
==LeftBomPoint
+Length ;0110]Rectlnfor.Point_B[l]==LeftBomPoint[1];0111]Rectlnfor.Point_B[2]==LeftBomPoint[2];0112]Rectlnfor.Point_C
==LeftBomPoint
+Length ;0113]Rectlnfor.Point_C[l]==LeftBomPoint[1]+Width ;0114]Rectlnfor.Point_C[2]==LeftBomPoint[2];0115]Rectlnfor.Point_D
==LeftBomPoint
;0116]Rectlnfor.Point_D[l]==LeftBomPoint[1]+Width ;0117]Rectlnfor.Point_D[2]==LeftBomPoint[2];0118]Rectlnfor. Bom = create—line—thru—2p (RectInfor· Point—A,Rectlnfor. Point—B);0119]Rectlnfor. Right = create—line—thru—2p (Rectlnfor. Point—B,Rectlnfor. Point—C)0120]Rectlnfor. Top = create—line—thru—2p (Rectlnfor· Point—C,Rectlnfor. Point—D);0121]Rectlnfor. Left=create_line_thru_2p (Rectlnfor. Point_D, Rectlnfor. Point_A)0122]double tempi[3],temp2[3]temp3[3], temp4[3];0123]for(int i = 0 ;i < 3 ;i++)0124]{0125]tempi [i]==(Rectlnfor.Point_A[i]+Rectlnfor. Point_D[i])/2 ;0126]temp2 [i]==(Rectlnfor.Point_B[i]+Rectlnfor. Point_C[i])/2 ;
上边TOP

temp3[i] = (Rectlnfor. Point_A[i]+RectInfor. Point_B[i])/2 ; temp4[i] = (Rectlnfor. Point_C[i]+Rectlnfor. Point_D[i])/2 ;
Rectlnfor.HC = create_line_thru_2p(tempi, temp2); Rectlnfor. VC = create_line_thru_2p(temp3, temp4); UF_0BJ_set_font(Rectlnfor. HC, UF_0BJ_F0NT_CENTERLINE);
UF_0BJ_set_font(Rectlnfor. UF_0BJ_set_font(Rectlnfor. UF_0BJ_set font(Rectlnfor. UF_0BJ_set_font(Rectlnfor. UF_0BJ_set_font(Rectlnfor. UF_0BJ_set_font(Rectlnfor. UF_0BJ_set_font(Rectlnfor. return Rectlnfor ;
VC, UF_0BJ_F0NT_CENTERLINE) HC, UF_0BJ_WIDTH_THIN); VC, UF_0BJ_WIDTH_THIN); Bom, UF_0BJ_WIDTH_THICK); Top, UF_0BJ_WIDTH_THICK); Left, UF_0BJ_WIDTH_THICK); Right, UF_0BJ_WIDTH_THICK);
//创建平行四边形本体,以左下角点,长度和宽度作为输入值。返回外部约束 ,下边Β0Μ,左边,Left,右边Right,竖直中心线VC和水平中心线HC MyRect CComDraw:CreateParalletFour(double BasePoint[], double Length,
double Width, double Angle)//创建平行四边形本体模块
{
MyRect ParallelInfor ;
if (Length < = O | | Width < = O | | Angle < = O | | Angle > = 180)
{
AfxMessageBoxC'输入参数有误,请检查参数。“);
}
Angle = Angle/180*PI ;
double Point_A[3], Point_B[3], Point_C[3], Point_D[3];
Point_A[0 Point_A[l Point_A[2 Point_B[0 Point_B[l Point_B[2 Point_C[0 Point_C[l Point_C[2 Point_D[0 Point_D[l Point_D[2
=BasePoint[O =BasePoint[1 =BasePoint[2_ =BasePoint
+Length ; =BasePoint[1]; =BasePoint[2]; =Point_B
+Width^cos(Angle); =Point_B[l]+Width^sin(Angle); =Point_B[2];
=Point_A
+Width^cos(Angle); =Point_A[l]+Width^sin(Angle); =Point_A[2];
80165]for(int i = 0 ;i < 3 ;i++)
0166]{
0167]ParalIelInfor. Point_A[i] = Point_A[i];
0168]ParalIelInfor. Point_B[i] = Point_B[i];
0169]ParalIelInfor. Point_C[i] = Point_C[i];
0170]ParalIelInfor. Point_D[i] = Point_D[i];
0171]}
0172]ParalIelInfor. Bom = create_line_thru_2p (ParallelInfor. Point_A, ParalIelInfor. P
0173]oint_B);
0174]ParalIelInfor. Right = create_line_thru_2p (ParallelInfor. Point_B, ParalIelInfor.
0175]Point_C);
0176]ParalIelInfor. Top = create_line_thru_2p (ParallelInfor. Point_C, ParalIelInfor. P
0177]oint_D);
0178]ParalIelInfor. Left = create_line_thru_2p (ParallelInfor. Point_D, ParalIelInfor. P
0179]oint_A);
0180]double tempi[3], temp2[3], temp3[3],temp4 [3];
0181]for(i = 0 ;i < 3 ;i++)
0182]{
0183]tempi[i] = (ParallelInfor. Point_A[i]+ParalIelInfor. Point_D[i])/2 ;
0184]temp2[i] = (ParallelInfor. Point_B[i]+ParalIelInfor. Point_C[i])/2 ;
0185]temp3[i] = (ParallelInfor. Point_A[i]+ParalIelInfor. Point_B[i])/2 ;
0186]temp4[i] = (ParallelInfor. Point_C[i]+ParalIelInfor. Point_D[i])/2 ;}Parallellnfor. HC = create_line_thru_2p (tempi, temp2);Parallellnfor. VC = create_line_thru_2p (temp3, temp4);UF_0BJ_set_font (Parallellnfor. HC, UF_0BJ_F0NT_CENTERLINE);UF_0BJ_set_font (Parallellnfor. VC, UF_0BJ_F0NT_CENTERLINE);UF_0BJ_set_font (Parallellnfor. HC, UF_0BJ_WIDTH_THIN);UF_0BJ_set_font (Parallellnfor. VC, UF_0BJ_WIDTH_THIN);UF_0BJ_set_font (Parallellnfor. Bom, UF_0BJ_WIDTH_THICK);UF_0BJ_set_font (ParallelInfor. Top, UF_0BJ_WIDTH_THICK);UF_0BJ_set_font (ParallelInfor. Left, UF_0BJ_WIDTH_THICK);UF_0BJ_set_font (Parallellnfor. Right, UF_0BJ_WIDTH_THICK);return Parallellnfor ;}bool CComDraw: : Trans (double x, double y, MyRect 0b j)//对四边形进行平移操作{int error = 0 ;/*-删除模型参数-*/uf_list_p_t object_list ;UF_MODL_create_list(&object_list); UF_MODL_put_list_item(object_list,Obj. Left); UF_MODL_put_list_item(object_list,Obj. Right); UF_M0DL_put_list_item(object_list, Obj.Bom); UF_MODL_put_list_item(object_list,Obj.Top); UF_M0DL_put_list_item(object_list, Obj. HC); UF_M0DL_put_list_item(object_list, 0bj. VC);
error = UF_CALL(UF_M0DL_delete_objectjarms (object_list)) ;//删除模型参数。
if (error)
{
AfxMessageBoxC'删除模型参数失败。“); return false ;
}
A-------------------------平移变换------------------------------------*/
double translation[3] 二 {0,0,0}; double rp2[16]; translation
= χ translation[l] = y translation[2] = 0 uf5943 (translation, rp2); //////////////////////////////////////////////////////// int EdgeNum = 0 ;
UF—M0DL—ask—list—count(object—list,&EdgeNum);
int move_or_copy = 1 ;
int dest_layer = _1 ;//work layer
int trace_curves = 2 ;
tag—t trace_curve_group ;
int statusl = 1 ;
int η—objects = EdgeNum ;
tag—t*objects = new tag—t[n_objects];
tag—t*copies = new tag—t[n_objects];
for (int k = 0 ;k < EdgeNum ;k++)
{
tag—t temp ;
UF_M0DL_ask_li st_item(ob ject_li st, k,&temp); 水(objects+k) = temp ;
ι
uf5947 (rp2, objects, &n_objects, &move_or copy, &dest_layer, &trace_curves, cop ies, &trace curve group, &statusl);
CNint type = 1 ;H第一个参数是要被修剪的直线的tag_t号Il第二个参数是边界的tag_t号,而且必须是连续的tag_t号数组H第三个参数控制修里边,还是修外面0或1Il注意上下两条边界线一定要是直线才成int tempback = BLACK ;int tempThinLineLayer = THINLINERLAYER ;// 设置细实线所在层临时变量int tempThickLineLayer = THICKLINELAYER ;// 设置粗实线所在层临时变量int tempNormalLayer = NORMALLINELAYER ;// 设置一般实线所在层临时变量int tempCenterLineLayer = CENTERLINELAYER ;// 设置中心线所在层临时变量int tempDashedLineLayer = DASHEDLINELAYER ;// 设置虚线所在层临时变量UF_CALL(UF_LAYER_set_status(tempThinLineLayer, UF_LAYER_ACTIVE_LAYER)) ;//设置层状态UF_CALL(UF_LAYER_set_status(tempThickLineLayer, UF_LAYER_ACTIVE_LAYER)) ;//设置层状态UF_CALL(UF_LAYER_set_status(tempCenterLineLayer, UF_LAYER_ACTIVE_LAYER)) ;//设置层状态UF_CALL(UF_LAYER_set_status(tempDashedLineLayer, UF_LAYER_ACTIVE_LAYER)) ;//设置层状态UF_CALL(UF_LAYER_set_status(tempNormalLayer, UF_LAYER_WORK_LAYER)) ;//设置层状态int trim_string[l], trim_dir[l], bound_string[l], bound_dir[l];tag_t trim_curve_feat ;UF_CURVE_trim_t trim_curve_info ;UF_CURVE_trim_mu1t_t out_info ;H------------------创建修剪曲线---------------------Il/*
if(statusl)
{
AfxMessageBox (“平移失败。‘’);
return false ;
}
return true ;
ι
tag_t CComDrawCreateTrimHaveTwoBound(tag_t&tag_line_needTrim,tag_t
tag_bound[], int InOrOut)//对四边形内部线条进行修剪
{
11
Fill in arrays to be used in string definition.*/trim一string
= 1 ; trim_dir
= 1 ;/*Fill in trim curve structure information to trim the first lineto the second line as a bounding string.*/trim_curve_info. string_to_trim. num = 1 -J/ 与 trim_string 数组成员个数相同trim_curve_info. string_to_trim. string = trim_string ;trim_curve_info. string_to_trim. dir = trim_dir ;trim_curve_info. string_to_trim. id = &tag_line_needTrim ;trim_curve_info. spline_extend_opt = UF_CURVE_EXTEND_N0NE ;trim_curve_info. trim_type = UF_CURVE_TRIM_T0_TW0_B0UND ;// 这个地方要注意UF_MODL_ask_distance_tolerance(&trim_curve_info. tolerances
);UF_MODL_ask_angle_tolerance(&trim_curve_info. tolerances[1]);/*Fill in arrays to be used in bound definition.*/bound一string
= 1 ;bound一dir
= 1 ;/*Fill in bounding information.*/trim_curve_info. trim_to. two_bound. string_extend_end =UF_CURVE_TRIM_EXTEND_END ;switch (InOrOut){case 0://留里边{trim_curve_info. trim_to. two_bound. string_trim_option =UF_CURVE_TRIM_0UTSIDE ;break ;}case 1://留外边{trim_curve_info. trim_to. two_bound. string_trim_option =UF_CURVE_TRIM_INSIDE ;break ;}
12
}trim_curve_info. trim_to. two_bound. boundl. string, num = 1 ;trim_curve_info. trim_to. two_bound. boundl. string, string = bound_string ;trim_curve_info. trim_to. two_bound. boundl. string, dir = bound_dir ;trim_curve_info. trim_to. two_bound. boundl. string, id = &tag_bound
;trim_curve_info. trim_to. two_bound. bound2. string, id = &tag_bound[l];trim_curve_info. trim_to. two_bound. boundl. use_suggested = FALSE ;trim_curve_info. trim_to. two_bound. boundl. object = NULL_TAG ;trim_curve_info. trim_to. two_bound. bound2. string, num = 1 ;trim_curve_info. trim_to. two_bound. bound2. string, string = bound_string ;trim_curve_info. trim_to. two_bound. bound2. string, dir = bound_dir ;trim_curve_info. trim_to. two_bound. bound2. use_suggested = FALSE ;trim_curve_info. trim_to. two_bound. bound2. object = NULL_TAG ;trim_curve_info. trim_to. two_bound. bound2. use_suggested = FALSE ;trim_curve_info. trim_to. two_bound. view = (UF_M0DL_vector_p_t)(void*) 0 ;trim_curve_info. trim_to. two_bound. trim_bound = FALSE ;H再创建修剪UF一CALL(UF_CUI VE_cre£ite_trim(&trim一curve_info,&out_info,&trim_curve_feat));//UF_OBJ_delete_object(tag_line_needTrim) ;// 把以前的线删除UF_0BJ_set_layer (tag_l ine_needTrim, 200) ;// 设置所在层UF_CALL(UF_LAYER_set_status(200, UF_LAYER_INACTIVE_LAYER)) ;//设置层状态tag_t tag_l ine_trimed ;UF_CALL(UF_CURVE_ask_line_arc_output(trim_curve_feat,&tag_line_trimed));int number ;tag_t*object = new tag_t[5];UF_M0DL_ask_feat_ob ject (trim_curve_feat, &number, &object);return object
;}MyRect CComDraw: :UpDate (MyRect 0b ject)//进行约束后,对新位置的几何特征体进行刷新{UF_CURVE_line_t line_coords ;UF_CURVE_£isk_line_d£it£i (Object. Bom,&line_coords);if(line_coords. start_point
> = line_coords. end_point
){
Object.Point—A
=line_coords.end—point

Object.Point—A[l]=line_coords.end—point[1];
Object.Point—A [2]=line_coords.end—point[2];
Object.Point—B
=line_coords.start—point
Object.Point—B[1]=line_coords.start—point[1]
Object.Point—B[2]=line_coords.start—point[2]
UF_CURVE_ask_line_data(Object. Top,&line_coords); if(line_coords. start—point
> = line_coords· end—point
)Object.Point—D
=line_coords.end—point

Object.Point—D [1]=line_coords.end—point[1];
Object.Point—D [2]=line_coords.end—point[2];
Object.Point—C
=line_coords.start—point
Object.Point—C [1]=line_coords.start—point[1]
Object.Point—C[2]=line_coords.start—point[2]
return Object ;
ι
bool CComDraw::PointtoPointTransLet(tag_t Edge[],int EdgeNum,double
StartPoint [],double EndPoint []) // 定位点重合约束
{
int error = O ;
/*-删除模型参数-*/
uf_list_p_t object_list ; UF_MODL_create_list(&object_list); for (int k = O ;k < EdgeNum ;k++)
UF_MODL_put_li st_item(object_li st, Edge[k]);
}
error = UF—CALL(UF—MODL—delete—object—parms(object—list)) 参数。
if (error) {
return false ;
ι
/*-平移变换-
删除模型
double translation[3]; double rp2 [16];
14
translation
= EndPoint
-StartPoint
;translation[1] = EndPoint[1]-StartPoint[1];translation[2] = EndPoint[2]-StartPoint[2];uf5943(translation, rp2);//////////////////////////////////////////////////////////////int move_or_copy = 1 ;int dest_layer = _1 ;//work layerint trace_curves = 2 ;tag_t trace_curve_group ;int status 1 = 1 ;int n_objects = EdgeNum ;tag_t*objects = new tag_t[n_objects];tag_t*copies = new tag_t[n_objects];for (k = O ;k < EdgeNum ;k++){氺(obj ects+k) = Edge [k];}uf5947 (rp2, objects, &n_objects, &move_or_copy, &dest_layer, &trace_curves, copies, &trace_curve_group, &statusl);if (statusl){AfxMessageBox (〃 平移失败。“);return false ;}llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllreturn true ;}bool CComDraw::ParallelEdgetoEdgeDistanceLet (MyRect recti, CString
edgel,MyRect rect2, CString edge2, double Distance)//平 亍禾口 巨离约束{int error = O ; /*-删除模型参数-*/uf_list_p_t object_list ;UF_MODL_create_list(&object_list);UF_MODL_put_list_item(object_list, rect2. Left);UF_MODL_put_list_item(object_list, rect2. Right);UF_MODL_put_list_item(object_list, rect2.Bom);
UF_MODL_put_list_item(object_list, rect2. Top);UF_MODL_put_list_item(object_list, rect2. HC);UF_MODL_put_list_item(object_list, rect2. VC);error = UF_CALL(UF_M0DL—delete_objectjarms (object_list)) ;// 删除模型参数。if(error){AfxMessageBoxC'删除模型参数失败。“);return false ;}/*-平移变换-*/double translation[3] = {0,0,0};double rp2[16];int id = 0 ;id = ((strcmp(edgel, “ Top" ) == θ| | strcmp (edgel, '’ Bom" ) == 0I I strcmp (edgel,“ HC" ) == 0)&&(strcmp (edge2, " Top" )==0|strcmp (edge2, “ Bom" ) == θ| | strcmp (edge2, " HC" ) == 0))I I ((strcmp (edge 1,“ Left" ) == 0 strcmp (edge 1,“ Right" ) == 0|strcmp (edgel, “ VC" ) == 0) && (strcmp (edge2, " Left" )=0|strcmp (edge2, “ Right" ) == θ| | strcmp (edge2, " YC" )==0));if (id == 0){AfxMessageBoxC'选择的边不平行,请从重新选择。“);return false ;}else{if ((strcmp (edgel,〃 Left “ )== 0 | | strcmp (edgel, 〃 Right" )==θ|strcmp (edgel, “ VC" ) == 0)&&(strcmp (edge2, ‘‘ Left" )==θ|strcmp (edge2, “ Right" ) == θ| | strcmp (edge2, " YC" ) == 0)){double S, E ;////////////////////////////////////////////////////////////if (strcmp (edge 1, " Left" ) = 二 0){S = recti. Point_A
;}if (strcmp (edgel, “ Right" ) = = 0){S = recti. Point_B

}if (strcmp (edge 1,‘‘ VC" ) = = 0){S= (recti. Point_A
+recti. Point_B
)/2 ;}///////////////////////////////////////////////////////////////if (strcmp(edge2, " Left" ) = 二 0){E = rect2. Point_A
;}if(strcmp(edge2, " Right" ) = = 0){E = rect2. Point_B
;}if(strcmp(edge2, " VC" ) = = 0){E = (rect2. Point_A
+rect2. Point_B
)/2 ;}//////////////////////////////////////////////////////////////if (Ε >= S){translation
= S-E+Distance ;translation [1] = 0 ;translation [2] = 0 ;}else{translation
= S-E-Distance ;translation [1] = 0 ;translation [2] = 0 ;}}if ((strcmp(edgel, " Top" ) == θ| | strcmp (edgel, “ Bom" ) == 0I strcmp (edgel, “ HC" ) == 0) && (strcmp (edge2, " Top" ) == 0strcmp (edge2, “ Bom" ) == θ| | strcmp (edge2, " HC" ) == 0)){double S = 0,E = 0 ;if (strcmp (edgel, “ Top" ) = = 0){
17
S = recti. Point_D[l];
}
if(strcmp(edgel, “ Bom" ) ==0)
{
S = recti. Point_A[l];
}
if(strcmp(edgel, “ HC" ) ==0)
{
S = (recti. Point_A[l]+rectl. Point_D[1])/2 ;
}
/////////////////////////////////////////////////////////
if(strcmp(edge2, “ Top" ) = = 0)
{
E = rect2. Point_D[l];
}
if(strcmp(edge2, “ Bom" ) ==0)
{
E = rect2. Point_A[l];
}
if(strcmp(edge2, “ HC" ) = = 0)
{
E = (rect2. Point_A[l]+rect2. Point_D[1])/2 ;
}
///////////////////////////////////////////////////////////
if (Ε >= S)
{
translation
= 0 ;
translation[1] = S-E+Distance ;
translation[2] = 0 ;
ι
else
{
translation
= 0 ;
translation[1] = S-E-Distance ;
translation[2] = 0 ;
ι
ι
}
uf5943 (translation, rp2);
18
////////////////////////////////////////////////////////int EdgeNum = 0 ;
UF_MODL_ask_list_count (ob ject_list, &EdgeNum);int move_or_copy = 1 ;int dest_layer = _1 ;//work layerint trace_curves = 2 ;tag_t trace_curve_group ;int statusl = 1 ;int n_objects = EdgeNum ;tag_t*objects = new tag_t[n_objects];tag_t*copies = new tag_t[n_objects];for (int k = 0 ;k < EdgeNum ;k++){tag_t temp ;UF_M0DL一ask_list_item(object_list,k,&temp);*(objects+k) = temp ;}uf5947 (rp2, objects, &n_objects, &move_or_copy, &dest_layer, &trace_curves, copies, &trace_curve_group, &statusl);if (statusl){AfxMessageBox (〃 平移失败。“);return false ;}Illlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllimlllllllreturn true ;}}三、基于面向对象的几何约束法的零部件二维快速设计采用基于图论的约束
求解方法进行工程图的约束模型的求解。方法通过几何约束图(geometricconstraint graph)表示几何约束图,若定义图G= (V E)为约束图元素几何,则V代表几何元素集合 边,E代表几何元素之间的约束集合。方法首先将几何约束系统映射成几何约束图,然后从 基点开始进行约束图的有向化约束求解,而方法的关键是确定结构点的输出次序。约束求 解的起点是基点,所谓的基点就是位置相对不变的结构点。当用户添加几何约束或进行尺 寸修改时,系统会根据用户的设计意图把某一结构点确定为基点然后从基点开始沿着约束 边进行约束图的有向化。其过程如图12,13所示。其中A结构通过与基点0建立点重合关 系,固定A的位置,B, C结构通用与A建立中线重合和距离约束确定位置;D,E结构通过与 B和C建立角度和与A的距离约束确定位置。
19
其约束代码如下void CLoopDraw:MainFunction (){double BasePoint[3] = {100,100,0};CComDraw draw ;draw. CreateDrawingFrame(800,1000,5,5, “ drawview“);AfxMessageBox (〃 边框创建完成。“);//create Rect oneMyRect tempRectl ;//define a Rectangle objectdouble Length = 6568 ;double Width = 31. 52 ;tempRectl = draw. CreateRect(BasePoint,Length,Width) ;//create the RectAfxMessageBox (“线圈本体矩形A创建完成。“);//create Rect twoMyRect tempRect2 ;//define a Rectangle objectLength = 64 ;Width = 19 ;tempRect2 = draw. CreateRect (BasePoint, Length, Width) ;//create the RectAfxMessageBox (〃通风槽矩形B创建完成。‘‘);MyRect tempRect3 ;//define a Rectangle objectLength = 650 ;Width = 19 ;tempRect3 = draw. CreateRect (BasePoint, Length, Width) ;//create the RectAfxMessageBox (〃通风槽矩形C创建完成。‘‘);/////////////////////////////////////////////////////////////////////////////////////////////////Zbool temp ;//Para edge to edge distance letCString EdgeStrl,EdgeStr2 ;double Distance = O ;Distance = O ;EdgeStrl = " HC";EdgeStr2 = " HC";temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl, EdgeStr 1, tempRect2,EdgeStr2,Distance);tempRect2 = draw. UpDate(tempRect2);AfxMessageBox (〃矩形A和矩形B水平中心线重合约束完毕〃);EdgeStrl = “ Left“;EdgeStr2 = “ Left “;temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl, EdgeStr 1, tempRect2
,EdgeStr2, Distance);tempRect2 = draw. UpDate(tempRect2);AfxMessageBox (“矩形A和矩形B左边重合约束完毕“);return ;EdgeStrl = “ HC";EdgeStr2 = “ HC";temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl, EdgeStr 1, tempRect3,EdgeStr2, Distance);tempRect3 = draw. UpDate(tempRect3);AfxMessageBoxC'矩形A和矩形C水平中心线重合约束完毕〃);EdgeStrl = “ Left “;EdgeStr2 = “ Left “;Distance = 74 ;temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl, EdgeStr 1, tempRect3,EdgeStr2, Distance);tempRect3 = draw. UpDate(tempRect3);AfxMessageBox (“矩形C左边距离和矩形A左边距离74,约束完毕“);IllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllimLength = 24 ;double Angle = 45 ;Width = 6. 26/sin(Angle/180*PI);MyRect paral ;paral = draw. CreateParalletFour (BasePoint, Length, Width, Angle);AfxMessageBox (〃平行四边形D创建完毕〃 )·’EdgeStrl = “ Top";EdgeStr2 = “ Top “;Distance = O ;temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl,EdgeStrl,paral,EdgeStr2, Distance);paral = draw. UpDate (paral);AfxMessageBoxC'平行四边形D上边和矩形A上边重合,约束创建完毕丨‘);double χ = (44—24/2)_Width*cos(Angle/180*PI);double y = O ;temp = draw. Trans (x, y, paral);paral = draw. UpDate (paral);AfxMessageBoxC'平行四边形D水平移动χ距离,约束创建完毕〃);//////////////////////////////////////////////////////////////////////////////
Length = 24 ;
Angle = 135 ;Width = 6. 26/sin(Angle/180*PI);MyRect para2 ;para2 = draw. CreateParalletFour (BasePoint, Length, Width, Angle);AfxMessageBox (〃平行四边形E创建完毕〃 )·’EdgeStrl = “ Top";EdgeStr2 = “ Top";Distance = O ;temp = draw. ParallelEdgetoEdgeDistanceLet (tempRectl,EdgeStr 1,para2,EdgeStr2, Distance);para2 = draw. UpDate (para2);AfxMessageBoxC'平行四边形E上边和矩形A上边重合,约束创建完毕“);χ = (44-24/2)-Width*cos(Angle/180*PI)+50 ;y = O ;temp = draw. Trans (χ, y, para2);para2 = draw. UpDate (para2);AfxMessageBoxC'平行四边形E水平移动χ距离,约束创建完毕〃);ΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙIl用平行四边形D的左边和右边为边界trim矩形B的上边tag_t tag_line_needTrim ;tag_t tag_bound[2];int InOrOut = 1 ;tag_line_needTrim = tempRect2. Top ;tag—bound
= paral. Left ;tag_bound[l] = paral. Right ;tag_ttemptag = draw. CreateTrimHaveTwoBound (tag_l ine_needTrim, tag—bound,InOrOut);UF_0BJ_delete_object(paral. Bom);H用平行四边形E的左边和右边为边界trim矩形C的上边tag_line_needTrim = tempRect3. Top ;tag—bound
= para2. Left ;tag_bound[l] = para2. Right ;temptag = draw. CreateTrimHaveTwoBound (tag_l ine_needTrim, tag—bound,InOrOut);UF_0BJ_delete_object(para2. Bom);//delete no use lineUF_0BJ_delete_object(tempRectl. VC);
22
UF_0BJ_delete_object(tempRect2. VC);UF_0BJ_delete_object(tempRect3. VC);UF_0BJ_delete_object(paral. HC);UF_0BJ_delete_object(para2. HC);}。原有的几何约束法的变量几何法中,几何特征都为基本几何元素特征,如点、直 线、圆弧等,然后根据图纸要求建立这些几何特征的将约束关系转换成以特征点坐标为变 量的非线性约束方程组,当约束发生变化时,通过Newton — Raphson法迭代求解方程组,计 算量非常大,且极易出现错误解。本发明采用面向对象的几何约束法,利用类的形式描述几 何元素,可将汽轮发电机中拓扑结构相对稳定的几何体表达成类对象进行操作,不但提高 了计算速度,由于其几何结构体内部拓扑结构相对稳定,基于几何约束的求解精度也较之 原有方法高。
权利要求
一种汽轮发电机关键部件的参数化设计方法,其特征在于,方法步骤如下一、对线圈的基本结构进行分解以模块化思想对线圈中具有几何互换性和稳定几何结构的模块进行划分,分解出基本模块、通用模块和专用模块三类;就线圈而言,基本模块包括线圈体模块和轴段本体;通用模块包括进风口模块和槽型模块;专用模块包括通风孔模块、小鱼尾模块、大鱼尾模块和镜像孔,几何模块进一步分解,以直线端部为例可进一步为A线圈本体;O基点;B,C通风槽;D,E进风口四个基本模块;二、面向对象的几何结构建模对已经划分的几何模块进行类描述,其中每个模块的描述模板为Class几何特征体类名称{几何体对象名称;几何体对外约束对象1tag;几何体对外约束对象2tag;......几何体对外约束对象ntag;CreateGeometry(参数1,参数2,参数3)//创建自身模块几何特征整体,其拓扑结构固定{返回几何体对外约束对象1tag;几何体对外约束对象2tag;......几何体对外约束对象ntag;}//////////////////////////////创建几何特征体与其他对象的约束关系CreateParallel(外部约束对象tag,几何体对外约束对象i tag,平行距离);CreatePerpend(外部约束对象tag,几何体对外约束对象i tag);CreateAngle(外部约束对象tag,几何体对外约束对象i tag,角度);RemoveInterLine();//去除与几何体相交后在几何体内部的留存线条;......//其他约束创建方法}三、基于面向对象的几何约束法的零部件二维快速设计采用基于图论的约束求解方法进行工程图的约束模型的求解;方法通过几何约束图(geometricconstraint graph)表示几何约束图,若定义图G=(V E)为约束图元素几何,则V代表几何元素集合边,E代表几何元素之间的约束集合;方法首先将几何约束系统映射成几何约束图,然后从基点开始进行约束图的有向化约束求解,而方法的关键是确定结构点的输出次序;约束求解的起点是基点,所谓的基点就是位置相对不变的结构点;当用户添加几何约束或进行尺寸修改时,系统会根据用户的设计意图把某一结构点确定为基点然后从基点开始沿着约束边进行约束图的有向化。
全文摘要
本发明公开了一种汽轮发电机关键部件的参数化设计方法,本发明方法步骤如下一、对线圈的基本结构进行分解以模块化思想对线圈中具有几何互换性和稳定几何结构的模块进行划分,分解出基本模块、通用模块和专用模块三类;二、面向对象的几何结构建模对已经划分的几何模块进行类描述;三、基于面向对象的几何约束法的零部件二维快速设计采用基于图论的约束求解方法进行工程图的约束模型的求解。本发明的面向对象的几何约束法比其他二维参数化设计方法具有结构清晰、计算量小,且几何特征定位准确。采用该方法提供的模板进行参数编程,程序思路清晰、封装性好、运行效率高。
文档编号G06F17/50GK101976285SQ201010519500
公开日2011年2月16日 申请日期2010年10月26日 优先权日2010年10月26日
发明者晁伟, 林琳, 王艳秋, 高侃 申请人:哈尔滨工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1