NX二次开发-测量投影距离

NXOPEN方法,直接录制测量投影距离命令

 1 NX9+VS2012
 2 
 3 #include <NXOpen/Annotations.hxx>
 4 #include <NXOpen/Assemblies_Component.hxx>
 5 #include <NXOpen/Assemblies_ComponentAssembly.hxx>
 6 #include <NXOpen/Body.hxx>
 7 #include <NXOpen/BodyCollection.hxx>
 8 #include <NXOpen/Face.hxx>
 9 #include <NXOpen/Line.hxx>
10 #include <NXOpen/NXException.hxx>
11 #include <NXOpen/Part.hxx>
12 #include <NXOpen/PartCollection.hxx>
13 #include <NXOpen/DirectionCollection.hxx>
14 #include <NXOpen/MeasureBuilder.hxx>
15 #include <NXOpen/MeasureDistance.hxx>
16 #include <NXOpen/MeasureDistanceBuilder.hxx>
17 #include <NXOpen/MeasureManager.hxx>
18 #include <NXOpen/Point.hxx>
19 #include <NXOpen/PointCollection.hxx>
20 #include <NXOpen/ScCollector.hxx>
21 #include <NXOpen/SelectDisplayableObject.hxx>
22 #include <NXOpen/NXObjectManager.hxx>
23 #include <uf_obj.h>
24 #include <uf_part.h>
25 #include <uf_ui.h>
26 
27 
28 
29 UF_initialize();
30 
31 
32 //找名字得到面的tag
33 tag_t FaceTag = NULL_TAG;
34 UF_OBJ_cycle_by_name("MYFACE", &FaceTag);
35 
36 //以下为NXOPEN录制
37 NXObject *nullNXObject(NULL);
38 MeasureDistanceBuilder *measureDistanceBuilder1;
39 measureDistanceBuilder1 = workPart->MeasureManager()->CreateMeasureDistanceBuilder(nullNXObject);
40 
41 Point3d origin1(0.0, 0.0, 0.0);
42 Vector3d vector1(0.0, 1.0, 0.0);//设置矢量方向
43 Direction *direction1;
44 direction1 = workPart->Directions()->CreateDirection(origin1, vector1, SmartObject::UpdateOptionAfterModeling);
45 
46 measureDistanceBuilder1->SetProjectionVector(direction1);//设置投影
47 
48 //创建点
49 NXOpen::Point3d Point1XYZ(0,0,0);
50 
51 //Point3d转Point
52 NXOpen::Point *Point1 = workPart->Points()->CreatePoint(Point1XYZ);
53 
54 //设置第一个对象
55 measureDistanceBuilder1->Object1()->SetValue(Point1);
56 
57 //设置第二个对象
58 Face *face1(dynamic_cast<Face *>(NXOpen::NXObjectManager::Get(FaceTag)));
59 measureDistanceBuilder1->Object2()->SetValue(face1);
60 
61 //创建,类型为投影距离
62 MeasureDistance *measureDistance1;
63 measureDistance1 = workPart->MeasureManager()->NewDistance(NULL, Point1, face1, direction1, MeasureManager::ProjectionTypeMinimum);
64 
65 //获得距离
66 double Distance = measureDistance1->Value();
67 
68 //打印
69 char msg[256];
70 sprintf_s(msg, "%f", Distance);
71 uc1601(msg, 1);
72 
73 //销毁删除
74 delete measureDistance1;
75 
76 UF_terminate();
77 
78 Caesar卢尚宇
79 2019年7月26日

UFUN写的算法

思路:自己指定原点和矢量方向,从原点沿着矢量方向作一条无限长的直线,在对选择的面获取面的原点和向量方向,创建一个基准平面(基准平面是无限大的),最后求直线和基准平面的交点到原点距离,就是投影距离。

  1 NX9+VS2012
  2 
  3 #include <uf.h>
  4 #include <uf_ui.h>
  5 #include <uf_csys.h>
  6 #include <uf_curve.h>
  7 #include <uf_obj.h>
  8 #include <uf_mtx.h>
  9 #include <uf_modl.h>
 10 
 11 
 12     
 13 UF_initialize();
 14 
 15 //找名字得到点的tag
 16 tag_t PointTag = NULL_TAG;
 17 UF_OBJ_cycle_by_name("MYPOINT", &PointTag);
 18 
 19 //找名字得到面的tag
 20 tag_t FaceTag = NULL_TAG;
 21 UF_OBJ_cycle_by_name("MYFACE", &FaceTag);
 22 
 23 //由点出发创建直线
 24 
 25 //创建向量方向
 26 double Vec[3] = { 0.0, 0.0, 1.0 };
 27 
 28 //3*3矩阵,输入Z向量,得到矩阵
 29 double Mtx[9];
 30 UF_MTX3_initialize_z(Vec, Mtx);
 31 
 32 //创建矩阵
 33 tag_t MatrixTag = NULL_TAG;
 34 UF_CSYS_create_matrix(Mtx, &MatrixTag);
 35 
 36 //创建临时坐标系
 37 double P1[3] = { 0.0, 0.0, 0.0 };//直线起点
 38 tag_t CsysTag = NULL_TAG;
 39 UF_CSYS_create_temp_csys(P1, MatrixTag, &CsysTag);
 40 
 41 //设置WCS
 42 UF_CSYS_set_wcs(CsysTag);
 43 
 44 //创建直线终点
 45 double P2[3] = { P1[0], P1[1] + 10000, P1[2] };
 46 
 47 //从当前工作坐标系转换到绝对坐标系
 48 int InputCsys = UF_CSYS_ROOT_WCS_COORDS;
 49 int OutputCsys = UF_CSYS_ROOT_COORDS;
 50 double OutputPoint[3];
 51 UF_CSYS_map_point(InputCsys, P2, OutputCsys, OutputPoint);
 52 
 53 //创建直线
 54 UF_CURVE_line_t LineCoods;
 55 LineCoods.start_point[0] = P1[0];
 56 LineCoods.start_point[1] = P1[1];
 57 LineCoods.start_point[2] = P1[2];
 58 LineCoods.end_point[0] = OutputPoint[0];
 59 LineCoods.end_point[1] = OutputPoint[1];
 60 LineCoods.end_point[2] = OutputPoint[2];
 61 tag_t LineTag = NULL_TAG;
 62 UF_CURVE_create_line(&LineCoods, &LineTag);
 63 
 64 //获得面的原点和向量方向
 65 int Type;
 66 double Point[3];
 67 double Dir[3];
 68 double Box[6];
 69 double Radius[3];
 70 double RadData[3];
 71 int NormDir;
 72 UF_MODL_ask_face_data(FaceTag, &Type, Point, Dir, Box, Radius, RadData, &NormDir);
 73 
 74 //创建基准平面
 75 tag_t Plane_Tag = NULL_TAG;
 76 UF_MODL_create_fixed_dplane(Point, Dir, &Plane_Tag);
 77 
 78 //求直线与基准平面的交点
 79 int IntersectionsNum;
 80 UF_MODL_intersect_info_p_t * Intersections;
 81 UF_MODL_intersect_objects(LineTag, Plane_Tag, 0.01, &IntersectionsNum, &Intersections);//输入两个对象tag,找交点
 82 
 83 double IntersectionsPoint[3];//交点坐标
 84 for (int i = 0; i < IntersectionsNum; i++)
 85 {
 86     int type = Intersections[i]->intersect_type;
 87     if (type == UF_MODL_INTERSECT_POINT)
 88     {
 89         IntersectionsPoint[0] = Intersections[i]->intersect.point.coords[0];
 90         IntersectionsPoint[1] = Intersections[i]->intersect.point.coords[1];
 91         IntersectionsPoint[2] = Intersections[i]->intersect.point.coords[2];
 92     }
 93 }
 94 
 95 //删除直线和基准平面
 96 UF_OBJ_delete_object(LineTag);
 97 UF_OBJ_delete_object(Plane_Tag);
 98 
 99 //打印
100 char msg[256];
101 sprintf_s(msg, "距离为:%f", IntersectionsPoint[1]);
102 uc1601(msg,1);
103 
104 //释放内存
105 UF_free(Intersections);
106 
107 UF_terminate();
108 
109 caesar卢尚宇
110 2019年7月26日

猜你喜欢

转载自www.cnblogs.com/nxopen2018/p/11253254.html
今日推荐