NXOPEN C# 装配空间(assembly space)与部件的坐标转换的概念
空间(space):部件的绝对坐标系所对应的空间,个人体现为可以部件的绝对坐标系体现。
装配空间(assembly space):组件被加入到装配中后组件所处的空间,个人体现为可以用装配根节点总装配部件的绝对坐标系体现。
装配根节点总装配部件使用函数UF_ASSEM_ask_root_part_occ或theSession.Parts.Display.ComponentAssembly.RootComponent查询,其原型是显示部件(theSession.Parts.Display)。
部件的绝对坐标与装配根节点的绝对坐标通过变换矩阵实现转换。
UF函数 UF_ASSEM_ask_transform_of_occ 和UF_ASSEM_ask_component_data可以查询组件的变换矩阵,得到的变换矩阵是[4][4]的二维数组,装配根节点下的绝对坐标=部件自身绝对坐标*变换矩阵。
当UF_ASSEM_ask_component_data的输入参数是事例(occurrence)时,得到组件自身绝对坐标系与装配根节点总装配部件绝对坐标系之间的变换矩阵,与当前工作部件无关。
当UF_ASSEM_ask_component_data的输入参数是实例(instance)时,得到组件自身绝对坐标系与直接父项装配组件绝对坐标系之间的变换矩阵,与当前工作部件与显示部件都无关(除非刚好是父装配)。
csys为坐标矩阵,orig为原点坐标,tr为4X4变换矩阵,对应关系如下:
tr[0][0]=csys[0], tr[0][1]=csys[3], tr[0][2]=csys[6], tr[0][3]=orig[0]
tr[1][0]=csys[1], tr[1][1]=csys[4], tr[1][2]=csys[7], tr[1][3]=orig[1]
tr[2][0]=csys[2], tr[2][1]=csys[5], tr[2][2]=csys[8], tr[2][3]=orig[2]
tr[3][0]=0, tr[3][1]=0,tr[3][2]=0,tr[3][3]=1
csys[0], csys[1], csys[2] =X向量
csys[3], cys[4], csys[5]=Y向量
csys[6], csys[7], cys[8] =Z向量
double[] oldPoint = new double[3] { 0, 0, 0 };//需要变换的点坐标
double[] newPoint = new double[3];//转换后的点
double[] TransMatrix = new double[16];//转换矩阵,newPoint=oldPoint*TransMatrix
//已知组件Tag获取变换矩阵
Tag cmpTag = (Tag)1111;//需要转换坐标的组件的Tag
string part_name, refset_name, instance_name;
double[] origin = new double[3];//原点
double[] csys_matrix = new double[9];//坐标系
double[,] transform = new double[4, 4];//4x4变换矩阵
//方式一
theUfSession.Assem.AskComponentData(cmpTag, out part_name, out refset_name, out instance_name, origin, csys_matrix, transform); //读取当前组件信息
//方式二
theUfSession.Assem.AskTransformOfOcc(cmpTag, transform);
//4x4变换矩阵变换为一维数组的变换矩阵TransMatrix
TransMatrix = new double[16] {
transform[0, 0], transform[0, 1], transform[0, 2], transform[0, 3],
transform[1, 0], transform[1, 1], transform[1, 2], transform[1, 3],
transform[2, 0], transform[2, 1], transform[2, 2], transform[2, 3],
transform[3, 0], transform[3, 1], transform[3, 2], transform[3, 3]};
//已知组件坐标系与原点计算变换矩阵
theUfSession.Mtx3.Transpose(csys_matrix, csys_matrix);//求转置矩阵
theUfSession.Mtx4.Initialize(1, origin, csys_matrix, TransMatrix);//求变换矩阵TransMatrix
// 部件自身坐标转换到装配空间下的绝对坐标
theUfSession.Mtx4.Vec3Multiply(oldPoint, TransMatrix, newPoint);
// 装配空间下的绝对坐标转换到部件自身坐标
double[] TransMatrix1 = new double[16];//新的变换矩阵
theUfSession.Mtx4.Invert(TransMatrix, TransMatrix1);//求逆矩阵
theUfSession.Mtx4.Vec3Multiply(oldPoint, TransMatrix1, newPoint);
//其它函数方法,部件自身坐标转换到装配空间下的绝对坐标
double[] TransMatrix2 = new double[12] {
transform[0, 0], transform[0, 1], transform[0, 2], transform[0, 3],
transform[1, 0], transform[1, 1], transform[1, 2], transform[1, 3],
transform[2, 0], transform[2, 1], transform[2, 2], transform[2, 3] };
newPoint = oldPoint;
theUfSession.Trns.MapPosition(newPoint, TransMatrix2);//坐标转换
浙公网安备 33010602011771号