|
// 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);
} |
|