Рис. 3.3. Результат работы программного кода
Создадим ещё один четырехугольник над цилидром, вращая который, получим заготовку под «шляпку» болта (рис. 3.4). Операция «вращение» выполним с параметром Positive, чтобы соединить две части.
Tag[] features2;
UFCurve.Line segment4 = new UFCurve.Line();
UFCurve.Line segment5 = new UFCurve.Line();
UFCurve.Line segment6 = new UFCurve.Line();
UFCurve.Line segment7 = new UFCurve.Line();
segment4.start_point = new double[3]; segment4.start_point[0] = 0.00; segment4.start_point[1] = 0.00; segment4.start_point[2] = height; segment4.end_point = new double[3]; segment4.end_point[0] = Radius * 1.5;
45
segment4.end_point[1] = 0.00; segment4.end_point[2] = height;
segment5.start_point = new double[3]; segment5.start_point[0] = Radius * 1.5; segment5.start_point[1] = 0.00; segment5.start_point[2] = height; segment5.end_point = new double[3]; segment5.end_point[0] = Radius * 1.5; segment5.end_point[1] = 0.00; segment5.end_point[2] = height * 1.25;
segment6.start_point = new double[3]; segment6.start_point[0] = Radius * 1.5; segment6.start_point[1] = 0.00; segment6.start_point[2] = height * 1.25; segment6.end_point = new double[3]; segment6.end_point[0] = 0.00; segment6.end_point[1] = 0.00; segment6.end_point[2] = height * 1.25;
segment7.start_point = new double[3]; segment7.start_point[0] = 0.00; segment7.start_point[1] = 0.00; segment7.start_point[2] = height * 1.25; segment7.end_point = new double[3]; segment7.end_point[0] = 0.00; segment7.end_point[1] = 0.00; segment7.end_point[2] = height;
Tag[] BoltArray1 = new Tag[5]; theUfSession.Curve.CreateLine(ref segment4, out BoltArray1[0]); theUfSession.Curve.CreateLine(ref segment5, out BoltArray1[1]); theUfSession.Curve.CreateLine(ref segment6, out BoltArray1[2]); theUfSession.Curve.CreateLine(ref segment7, out BoltArray1[3]);
46
double[] ref_pt2 = new double[3]; ref_pt1[0] = 0.00;
ref_pt1[1] = 0.00; ref_pt1[2] = height;
double[] direction2 = { 0.00, 0.00, 1.00 }; string[] limit2 = { "0", "360" };
theUfSession.Modl.CreateRevolved(BoltArray1, limit2, ref_pt2, direction2, FeatureSigns.Positive, out features2);
Рис. 3.4. Построенная программно «шляпка» болта
Следующая команда используется для скругления «шляпки» болта (рис. 3.5).
Tag feat1 = features2[0];
Tag cyl_tag, obj_id_camf, blend1; Tag[] Edge_array_cyl, list1, list2; int ecount;
theUfSession.Modl.AskFeatBody(feat1, out cyl_tag); theUfSession.Modl.AskBodyEdges(cyl_tag, out Edge_array_cyl); theUfSession.Modl.AskListCount(Edge_array_cyl, out
47
ecount);
ArrayList arr_list1 = new ArrayList(); ArrayList arr_list2 = new ArrayList();
for (int ii = 0; ii < ecount; ii++)
{
Tag edge;
theUfSession.Modl.AskListItem(Edge_array_cyl, ii, out edge); if (ii == 2)
{
arr_list2.Add(edge);
}
}
list2 = (Tag[])arr_list2.ToArray(typeof(Tag));
int allow_smooth = 0; int allow_cliff = 0; int allow_notch = 0; double vrb_tol = 0.0;
string rad1 = Convert.ToInt32(Radius).ToString(); theUfSession.Modl.CreateBlend(rad1, list2, allow_smooth,
allow_cliff, allow_notch, vrb_tol, out blend1);
Рис. 3.5. Скругление «шляпки» болта
48
Теперь необходимо добавить символическую резьбу на цилидр меньшего радиуса. Для этого добавим следующий код.
Tag feat = features1[0]; Tag[] FeatFaces;
int FacesCount, FaceType, FaceNormDir; Tag face, s_face, c_face, feature_eid; double[] point = new double[3]; double[] dir = new double[3];
double[] box = new double[6]; double radius, rad;
s_face = new Tag(); c_face = new Tag();
theUfSession.Modl.AskFeatFaces(feat, out FeatFaces); theUfSession.Modl.AskListCount(FeatFaces, out
FacesCount);
UFModl.SymbThreadData thread = new
UFModl.SymbThreadData();
for (int i = 0; i < FacesCount; i++)
{
theUfSession.Modl.AskListItem(FeatFaces, i, out face); theUfSession.Modl.AskFaceData(face, out FaceType,
point, dir, box, out radius, out rad, out FaceNormDir);
if (FaceType == 22)
{
s_face = face; //UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Information, "Planar face");
}
if (FaceType == 16)
{
49