QQ登录

只需一步,快速开始

快捷登录

登录 或者 注册 请先

UG爱好者

查看: 2591|回复: 8
打印 上一主题 下一主题

[分享] 谁能注释一下这个程序

[复制链接]

列兵

Rank: 1

2

主题

4

帖子

0

积分
跳转到指定楼层
楼主
发表于 2011-6-28 21:05:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// geardialog 消息处理程序
  double m;
  int z;
  double kuandu;
  ProGeomitem geomfront, geomtop, geomright;
  ProGeomitem geomfront1, geomtop1, geomright1;
  ProGeomitem  limian;
  ProGeomitem  zhouxian;
  ProSelection sellimian;

  ProSelection right;
  ProSelection top;
  ProSelection front;
  ProSelection right1;
  ProSelection top1;
  ProSelection front1;
  ProSelection cylinder_axis;
  ProDimension *dim;

#define sqr(a) ((a)*(a))
#define PI          3.14159265358979323846
ProError ProUtilTwoCircleIntersection(Pro2dCircledef *c1, Pro2dCircledef *c2, Pro2dPnt p1,Pro2dPnt p2)
{
    double d, x1, y1, sa, ca;
    d = sqrt(sqr(c1->center[0]-c2->center[0]) + sqr(c1->center[1]-c2->center[1]));
    if ((d<EPSM) || (d>c1->radius + c2->radius) ||
        (d + c1->radius < c2->radius) || (d + c2->radius < c1->radius))
        return (PRO_TK_GENERAL_ERROR);

    y1 = (sqr(c1->radius) + sqr(d) - sqr(c2->radius)) / 2 /d;
    x1 = sqrt(sqr(c1->radius) - sqr(y1));

    sa = (c2->center[0]-c1->center[0]) / d;
    ca = (c2->center[1]-c1->center[1]) / d;

    p1[0] = y1 * sa + x1 * ca + c1->center[0];
    p1[1] = y1 * ca - x1 * sa + c1->center[1];
    p2[0] = y1 * sa - x1 * ca + c1->center[0];
    p2[1] = y1 * ca + x1 * sa + c1->center[1];
   
    return (PRO_TK_NO_ERROR);
}

int UsrCreateSection_gear(ProSection section,int index)//
{
    int            line_id[12];
        Pro2dCircledef circle1;
        switch (index)
        {
          case 1: //作圆
           circle1.center[0]=0.0;
                circle1.center[1]=0.0;
                circle1.radius=(m*z+2*m)/2;//
                circle1.type=PRO_2D_CIRCLE;
                ProSectionEntityAdd (section,(Pro2dEntdef*)&circle1, &line_id[1]);

        break;
     case 2:         //齿形
     ProError err;
     Pro2dLinedef line;
    Pro2dPnt     point, p1, p2, p3;
    Pro2dCircledef  *p_circle,add_circle, ded_circle, t_circle;//
    Pro2dArcdef arc;
    int dims[2], brk=0, ring_gear,  arc1_id, arc2_id, d_id;
    int circle_id,ded_id;//
    ProSectionPointType pnt_types[2];
    ProWSecerror errors;
    double d, r, angle, r_base, r_t, an ;

    err =ProSectionEntityFromProjection(section, sellimian, &circle_id);
        err = ProSectionEntityGet(section, circle_id, (Pro2dEntdef**)&p_circle);
        r = (m*z+2*m)/2;       
        d = m* z;
        ring_gear = r < d/2;
        angle = 20*PI/180;
        r_t = d/2 * sin(angle);
        r_base = d/2 * cos(angle); //

        add_circle.radius = r;
        ded_circle.radius = d/2-1.2*m;
        angle = PI/2 - angle - PI/(z*2);

        add_circle.center[0] = ded_circle.center[0] = 0;
        add_circle.center[1] = ded_circle.center[1] = 0;

        t_circle.center[0] = 0.0 + r_base * cos(angle);
        t_circle.center[1] = 0.0 + r_base * sin(angle);
        t_circle.radius = r_t;
        ProUtilTwoCircleIntersection(&add_circle, &t_circle, p1, p2);

        if (p1[0]>p2[0])
        memcpy(p1, p2, sizeof(p1));

        ProUtilTwoCircleIntersection(&ded_circle, &t_circle, p2, p3);
       
        if (p2[0]>p3[0])
        memcpy(p2, p3, sizeof(p1));
       
        line.type = PRO_2D_CENTER_LINE;
        line.end1[0] = 0;
        line.end1[1] = 0;
        line.end2[0] = 0;
        line.end2[1] = 0 + r;
        err = ProSectionEntityAdd(section, (Pro2dEntdef*)&line, &d_id);   

        arc.type =  PRO_2D_ARC;
        memcpy(arc.center, t_circle.center, sizeof(arc.center));
        arc.start_angle = atan2(p1[1]-arc.center[1], p1[0]-arc.center[0]);
        arc.end_angle = atan2(p2[1]-arc.center[1], p2[0]-arc.center[0]);
        arc.radius = r_t;
        err = ProSectionEntityAdd(section, (Pro2dEntdef*)&arc, &arc1_id);   

        an = PI - arc.start_angle;
        arc.start_angle = PI - arc.end_angle;
        arc.end_angle = an;
        arc.center[0] = (2 * 0 ) - arc.center[0];
        err = ProSectionEntityAdd(section, (Pro2dEntdef*)&arc, &arc2_id);   

        memcpy(arc.center, ded_circle.center, sizeof(arc.center));
        arc.start_angle = atan2( p2[1] - arc.center [1], p2[0] - arc.center [0]);
        arc.end_angle = PI - arc.start_angle;
        arc.radius = ded_circle.radius;
        err = ProSectionEntityAdd(section, (Pro2dEntdef*)&arc, &ded_id);   

        point[0] =0.0;//
        point[1] = t_circle.center[1] + 1;
        pnt_types[0] = PRO_ENT_CENTER;
        pnt_types[1] = PRO_ENT_CENTER;
        dims[0] = arc1_id;
        dims[1] = arc2_id;
        err = ProSecdimCreate(section, dims, pnt_types, 2,PRO_TK_DIM_PNT_PNT_HORIZ, point, &d_id);

        point[0] = 1.2 * t_circle.center[0];
        point[1] = t_circle.center[1]/2;
        dims[1] =circle_id;//
        err = ProSecdimCreate(section, dims, pnt_types, 2,PRO_TK_DIM_PNT_PNT_VERT, point, &d_id);

        point[0] = 0;
        if (ring_gear)
            point[1] = 1.2 * ded_circle.radius;
        else
            point[1] = 0.8 * ded_circle.radius;
        pnt_types[0] = PRO_ENT_WHOLE;
        err = ProSecdimCreate(section, &ded_id, pnt_types, 1, PRO_TK_DIM_RAD, point, &d_id);  
       
        point[0] = p1[0] * 1.2;
        point[1] = p1[1] * 1.2;
        err = ProSecdimCreate(section, &arc1_id, pnt_types, 1, PRO_TK_DIM_RAD, point, &d_id);  

    err = ProSecerrorAlloc(&errors);
        err = ProSectionSolve(section, &errors);
        if (err != PRO_TK_NO_ERROR)
            break;

        err = ProSecerrorFree(&errors);

         break;
        }
     
        return (1);
}
ProError UserSectionBuild1_gear(ProSection section,int index)       
{
ProError status=PRO_TK_NO_ERROR;
    if(!UsrCreateSection_gear(section,index))//
        {
         AfxMessageBox(_T("Section Error!"));
          return status;
        }
  return status ;
}

ProError UserSectionBuild_gear(ProSection section,int index        )
{
    ProError status;
    int ent_id;
    ProWSecerror serrors;
    if(!UsrCreateSection_gear(section,index))//
        {
          return status;
        }
         ProSectionEntityFromProjection(section,right1 , &ent_id);
         status=ProSectionEntityFromProjection(section,top1 , &ent_id);
     ProSecerrorAlloc(&serrors);
     status=ProSectionAutodim(section, &serrors);
     return status ;
}

int UsrCreatDefDtm1_gear(ProDtmplnConstrType pro_dtmpln_def,ProName dtm_name,ProFeature *myfeature)
{
  ProError         status;
  ProElement elem_tree,elem_type,elem_consts,elem_const,elem_const1,elem_const_type,elem_const_ref,elem_const_type1,elem_const_ref1,elem_const_ref_angle;
  ProValueData     value_data;
  ProValue         value;
  ProModelitem     model_modelitem;
  ProSelection     mdl_sel;
  ProErrorlist     errors;
  ProSolid solid;

  ProElementAlloc (PRO_E_FEATURE_TREE, &elem_tree);
  ProElementAlloc (PRO_E_FEATURE_TYPE, &elem_type);
  value_data.type = PRO_VALUE_TYPE_INT;
  value_data.v.i = PRO_FEAT_DATUM;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet (elem_type, value);  
  ProElemtreeElementAdd (elem_tree, NULL, elem_type);
  ProElementAlloc (PRO_E_DTMPLN_CONSTRAINTS, &elem_consts);
  ProElemtreeElementAdd (elem_tree, NULL, elem_consts);

  ProElementAlloc (PRO_E_DTMPLN_CONSTRAINT, & elem_const);
  ProElemtreeElementAdd (elem_consts, NULL, elem_const);

  ProElementAlloc (PRO_E_DTMPLN_CONSTR_TYPE, &elem_const_type);
  value_data.type = PRO_VALUE_TYPE_INT;
  value_data.v.i = PRO_DTMPLN_THRU;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet(elem_const_type, value);  
  ProElemtreeElementAdd (elem_const, NULL,elem_const_type);

  ProElementAlloc (PRO_E_DTMPLN_CONSTR_REF, &elem_const_ref);
  value_data.type = PRO_VALUE_TYPE_SELECTION;
  value_data.v.r =cylinder_axis ;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet(elem_const_ref, value);  
  ProElemtreeElementAdd (elem_const, NULL,elem_const_ref);

  ProElementAlloc (PRO_E_DTMPLN_CONSTRAINT, & elem_const1);
  ProElemtreeElementAdd (elem_consts, NULL, elem_const1);

  ProElementAlloc (PRO_E_DTMPLN_CONSTR_TYPE, &elem_const_type1);
  value_data.type = PRO_VALUE_TYPE_INT;
  value_data.v.i = PRO_DTMPLN_ANG;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet(elem_const_type1, value);  
  ProElemtreeElementAdd (elem_const1, NULL,elem_const_type1);

  ProElementAlloc (PRO_E_DTMPLN_CONSTR_REF, &elem_const_ref1);
  value_data.type = PRO_VALUE_TYPE_SELECTION;
  value_data.v.r = right1;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet(elem_const_ref1, value);  
  ProElemtreeElementAdd (elem_const1, NULL,elem_const_ref1);

  ProElementAlloc (PRO_E_DTMPLN_CONSTR_REF_ANGLE, &elem_const_ref_angle);
  value_data.type = PRO_VALUE_TYPE_DOUBLE;
  value_data.v.d = 0.0;
  ProValueAlloc (&value);
  ProValueDataSet (value, &value_data);
  ProElementValueSet(elem_const_ref_angle, value);  
  ProElemtreeElementAdd (elem_const1, NULL,elem_const_ref_angle);

  ProMdlCurrentGet((ProMdl*)&solid);
  ProMdlToModelitem(solid, &model_modelitem);
  ProSelectionAlloc(NULL, &model_modelitem, &mdl_sel);

  ProFeatureCreate (mdl_sel, elem_tree, NULL, 0,myfeature,&errors);
  status=ProModelitemNameSet(myfeature,dtm_name);
  status=ProFeatureRedefine(NULL, myfeature, elem_tree, NULL, 0, &errors);

  ProElementFree (&elem_tree);
  ProSelectionFree (&mdl_sel);return (status);
}

有奖推广贴子: 

回复

使用道具 举报

二级士官

Rank: 2

32

主题

416

帖子

449

积分
沙发
发表于 2011-6-28 21:09:14 | 只看该作者
小弟不才,还没这水平
回复 支持 反对

使用道具 举报

三级士官

Rank: 3Rank: 3

80

主题

595

帖子

676

积分
板凳
发表于 2011-6-28 21:53:02 | 只看该作者
看到我头晕眼花的
回复 支持 反对

使用道具 举报

列兵

Rank: 1

15

主题

78

帖子

0

积分
地板
发表于 2011-6-28 22:30:49 | 只看该作者
这是一个自动生成三维图形的程序的一种一部分,我没细看大体应该是个齿轮吧,前两个函数体是描述齿轮的大体形状,因为有好多的坐标点设定,最后一个函数体是为生成三维图形而建立的特征树,应该是拉伸特征,中间的一些函数都是很简单的函数,就不说了,呵呵,自己研究吧。
回复 支持 反对

使用道具 举报

列兵

Rank: 1

14

主题

180

帖子

0

积分
5#
发表于 2011-6-29 11:05:47 | 只看该作者
画齿轮的,
回复 支持 反对

使用道具 举报

列兵

Rank: 1

0

主题

17

帖子

0

积分
6#
发表于 2012-5-11 17:27:23 | 只看该作者
老天,太蓝!大海,太咸!人生,太难!工作,太烦!和你,有缘!想你,失眠!见你,太远!

我在顶贴~!~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

 
 
QQ:1359218528
工作时间:
9:00-17:00
 
微信公众号
手机APP
机械社区
微信小程序

手机版|UG爱好者论坛 ( 京ICP备10217105号-2 )    论坛管理员QQ:1359218528

本站信息均由会员发表,不代表本网站立场,如侵犯了您的权利请联系管理员,邮箱:1359218528@qq.com  

Powered by UG爱好者 X3.2  © 2001-2014 Comsenz Inc. GMT+8, 2024-6-17 12:58

返回顶部