【NX二次开发】uf5945获得旋转矩阵、uf5947根据变换矩阵移动或复制对象
返回一个矩阵,可以绕任意轴旋转。
与uf5947结合可以将对象沿着任意轴进行旋转。不是所有对象都能用uf5947变换,带参的实体、部件都不可以用此函数变换。下面是旋转WCS的例子。
extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_initialize(); tag_t wcs_id; UF_CSYS_ask_wcs(&wcs_id); tag_t matrix_id = NULL_TAG; double o_point[3];//旋转轴通过的点 double vec[3];//旋转轴方向 UF_CSYS_ask_csys_info(wcs_id, &matrix_id, o_point); //获得 3x3矩阵数据 double wsc_9[9]; UF_CSYS_ask_matrix_values(matrix_id, wsc_9); //UF_MTX3_x_vec(wsc_9, vec);//绕X轴逆时针旋转 //UF_MTX3_y_vec(wsc_9, vec);//绕X轴逆时针旋转 UF_MTX3_z_vec(wsc_9, vec);//绕Z轴逆时针旋转 double angle = 90.0; double matrix16[16]; //矩阵 int status; uf5945(o_point, vec, &angle, matrix16, &status); int objects = 1; //数量 int move = 2; // 1 :移动 2 :复制 int layer = -1; //0:最初层; -1: 工作层; 1 - 256 : 指定层 int trace_curves = 2; //轨迹状态, 1 开, 2 关 tag_t wsc_t2 = NULL_TAG; //变化后坐标tag //uf5947将某个obj进行移动或复制 uf5947(matrix16, &wcs_id, &objects, &move, &layer, &trace_curves, &wsc_t2, NULL, &status);//第二个对象 为被移动的对象 UF_CSYS_set_wcs(wsc_t2); UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }
效果:
将一个四方块,旋转复制变成3个试试:
源码:
extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_initialize(); double o_point[3];//旋转轴通过的点 double vec[3];//旋转轴方向 tag_t tagBody1 = 45655; tag_t tagBody2 = NULL_TAG;//复制的第一个体 tag_t tagBody3 = NULL_TAG;//复制的第二个体 tag_t wcs_id; UF_CSYS_ask_wcs(&wcs_id); tag_t matrix_id = NULL_TAG; UF_CSYS_ask_csys_info(wcs_id, &matrix_id, o_point); //获得 3x3矩阵数据 double wsc_9[9]; UF_CSYS_ask_matrix_values(matrix_id, wsc_9); //UF_MTX3_x_vec(wsc_9, vec);//绕X轴逆时针旋转 //UF_MTX3_y_vec(wsc_9, vec);//绕X轴逆时针旋转 UF_MTX3_z_vec(wsc_9, vec);//绕Z轴逆时针旋转 double angle = 120; double matrix16[16]; //矩阵 int status; uf5945(o_point, vec, &angle, matrix16, &status); int objects = 1; //数量 int move = 2; // 1 :移动 2 :复制 int layer = -1; //0:最初层; -1: 工作层; 1 - 256 : 指定层 int trace_curves = 2; //轨迹状态, 1 开, 2 关 //uf5947将某个obj进行移动或复制 uf5947(matrix16, &tagBody1, &objects, &move, &layer, &trace_curves, &tagBody2, NULL, &status); uf5947(matrix16, &tagBody2, &objects, &move, &layer, &trace_curves, &tagBody3, NULL, &status); UF_terminate(); } extern int ufusr_ask_unload(void) { return (UF_UNLOAD_IMMEDIATELY); }
效果: