Копирование точки из одной системы координат в ту же позицию, но в другую систему координат. Выбирается сначало одна CSYS, потом вторая, после этого выбирается точка. Координаты точки относительно первой системы координат преобразуются во вторую систему координат, тем самым координаты точки относительно первой и второй системы координат равны, но положение относительно абсолютной системы координат разное.
Код на C++ static void PrintErrorMessage(int errorCode, int line) { if(errorCode) { char message[133]; UF_get_fail_message(errorCode,message); UF_UI_set_status(message); fprintf(prterr,"errorCode=%d\tmessage=%s\tline=%d\n",errorCode,message,line); fflush(prterr); errorCode=0; } } int csys_init_proc(UF_UI_selection_p_t select, void* user_data) { int ret_code; int num_triples=1; UF_UI_mask_t mask_triples[]={UF_coordinate_system_type,0,0}; ret_code=UF_UI_set_sel_mask (select,UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,num_triples,mask_triples); if(ret_code==0) return UF_UI_SEL_SUCCESS; return UF_UI_SEL_FAILURE; } int point_init_proc(UF_UI_selection_p_t select, void* user_data) { int ret_code; int num_triples=1; UF_UI_mask_t mask_triples[]={UF_point_type,0,0}; ret_code=UF_UI_set_sel_mask (select,UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC,num_triples,mask_triples); if(ret_code==0) return UF_UI_SEL_SUCCESS; return UF_UI_SEL_FAILURE; } void copy_point_csystocsys() { tag_t csys1_tag; label_get_csys1: // { char* message="Выбери первую csys"; char* title="Выбери первую csys"; int scope=UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY; int response; tag_t object; double cursor[3]; tag_t view; errorCode=UF_UI_select_with_single_dialog (message,title,scope,csys_init_proc,NULL,&response,&object,cursor,&view);PRTERR; switch(response) { case UF_UI_BACK: goto label_get_csys1; case UF_UI_CANCEL: goto term; case UF_UI_OK: break; case UF_UI_OBJECT_SELECTED: break; case UF_UI_OBJECT_SELECTED_BY_NAME: break; } if(object==NULL_TAG) { uc1601("Будьте любезны выбрать первую csys",1); goto label_get_csys1; } //set highlight off errorCode=UF_DISP_set_highlight(object,0);PRTERR; csys1_tag=object; } tag_t csys2_tag; label_get_csys2: // { char* message="Выбери вторую csys"; char* title="Выбери вторую csys"; int scope=UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY; int response; tag_t object; double cursor[3]; tag_t view; errorCode=UF_UI_select_with_single_dialog (message,title,scope,csys_init_proc,NULL,&response,&object,cursor,&view);PRTERR; switch(response) { case UF_UI_BACK: goto label_get_csys1; case UF_UI_CANCEL: goto term; case UF_UI_OK: break; case UF_UI_OBJECT_SELECTED: break; case UF_UI_OBJECT_SELECTED_BY_NAME: break; } if(object==NULL_TAG) { uc1601("Будьте любезны выбрать вторую csys",1); goto label_get_csys2; } //set highlight off errorCode=UF_DISP_set_highlight(object,0);PRTERR; csys2_tag=object; } tag_t point_tag; label_get_point: // { char* message="Выбери точку"; char* title="Выбери точку"; int scope=UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY; int response; tag_t object; double cursor[3]; tag_t view; errorCode=UF_UI_select_with_single_dialog (message,title,scope,point_init_proc,NULL,&response,&object,cursor,&view);PRTERR; switch(response) { case UF_UI_BACK: goto label_get_csys2; case UF_UI_CANCEL: goto term; case UF_UI_OK: break; case UF_UI_OBJECT_SELECTED: break; case UF_UI_OBJECT_SELECTED_BY_NAME: break; } if(object==NULL_TAG) { uc1601("Будьте любезны выбрать точку",1); goto label_get_point; } //set highlight off errorCode=UF_DISP_set_highlight(object,0);PRTERR; point_tag=object; } { double from_origin[ 3 ]; double from_x_axis[ 3 ]; double from_y_axis[ 3 ]; double to_origin[ 3 ]; double to_x_axis[ 3 ]; double to_y_axis[ 3 ]; double mtx[ 16 ]; tag_t matrix_id; double matrix_values[ 9 ]; double point_coords[3]; tag_t point; errorCode=UF_CSYS_ask_csys_info (csys1_tag,&matrix_id,from_origin);PRTERR; errorCode=UF_CSYS_ask_matrix_values(matrix_id, matrix_values);PRTERR; UF_VEC3_copy(matrix_values+0,from_x_axis); UF_VEC3_copy(matrix_values+3,from_y_axis); errorCode=UF_CSYS_ask_csys_info (csys2_tag,&matrix_id,to_origin);PRTERR; errorCode=UF_CSYS_ask_matrix_values(matrix_id, matrix_values);PRTERR; UF_VEC3_copy(matrix_values+0,to_x_axis); UF_VEC3_copy(matrix_values+3,to_y_axis); errorCode=UF_MTX4_csys_to_csys (from_origin,from_x_axis,from_y_axis,to_origin,to_x_axis,to_y_axis,mtx);PRTERR; errorCode=UF_CURVE_ask_point_data (point_tag,point_coords);PRTERR; UF_MTX4_vec3_multiply (point_coords,mtx,point_coords); errorCode=UF_CURVE_create_point (point_coords,&point );PRTERR; } goto term; term: return; }
|