秋爱 发表于 2015-8-3 10:49:22

绝对坐标系下此功能成功,转动坐标系后失败。

       请大家帮忙看看,我做了一个点对话框,选取点的位置后会生成一个圆,之后弹出一个矢量对话框,选好矢量后会拉伸这个圆(因为圆在xy平面最好选z轴正向或负向)。绝对坐标系下是成功的,坐标系也转换了,转动动态坐标系后失败,不在点选取的位置生成圆,圆的位置到处跑。以下是代码,大家帮忙看看。
    #include <stdio.h>
#include <stdarg.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_curve.h>
#include <uf_modl.h>
#include <uf_mtx.h>
#include <uf_csys.h>

static void ECHO(char *format, ...)
{
    char msg;
    va_list args;
    va_start(args, format);
    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);
    va_end(args);
    UF_UI_open_listing_window();
    UF_UI_write_listing_window(msg);
    UF_print_syslog(msg, FALSE);
}
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
      char err;
      UF_get_fail_message(irc, err);
      ECHO("*** ERROR code %d at line %d in %s:\n",
            irc, line, file);
      ECHO("+++ %s\n", err);
      ECHO("%s;\n", call);
    }
    return(irc);
}

/*****************************************************************************
**Activation Methods
*****************************************************************************/
/*Explicit Activation
**      This entry point is used to activate the application explicitly, as in
**      "File->Execute UG/Open->User Function..." */


tag_t oldwcs = null_tag;
double origin = {0,0,0};
tag_t csys = null_tag;
tag_tmatrix_id;
double csys_origin ;
double matrix_values ;
double x_vec ;
double y_vec ;
double z_vec ;
double mtx ;
tag_tmtxid = null_tag;
tag_t arc = null_tag;
UF_CURVE_arc_tarc_coord;
double origincenter = {0,0,0};
uf_list_p_t objects;
char*taper_angle = "0";
char * limit [ 2 ] = {"0","60"};
double point = {0,0,0};
//double direction [ 3 ] = {0,0,1};

uf_list_p_t features;
char * message = "vector";
intmode = UF_UI_INFERRED ;
double direction ;
double origin ;
int response;
char * cue ="point";
int mode_sel [ 2 ] = {1,0};
int point_display_mode = 1;
double point_sel ;
//double outputpoint;

extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) )
    {
      /* Failed to initialize */
      return;
    }
   
    /* TODO: Add your application code here */

UF_CSYS_ask_wcs(&oldwcs);                              
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
UF_MTX3_x_vec(matrix_values,x_vec);                  
UF_MTX3_y_vec(matrix_values,y_vec);
UF_MTX3_z_vec(matrix_values,z_vec);
UF_MTX3_initialize(x_vec,y_vec,mtx);               
UF_CSYS_create_matrix(mtx,&mtxid);
UF_CSYS_create_csys(csys_origin,mtxid,&csys);   
UF_CSYS_set_wcs(csys);


l10:
    uc1616(cue,mode_sel,point_display_mode,point_sel);
//UF_CSYS_map_point(UF_CSYS_ROOT_COORDS,point_sel,csys,outputpoint);

arc_coord.arc_center=point_sel;
arc_coord.arc_center=point_sel;
arc_coord.arc_center=point_sel;
arc_coord.start_angle = 0;
arc_coord.end_angle = 360.0 * DEGRA;
arc_coord.matrix_tag = mtxid;
arc_coord.radius = 20;

UF_CALL(UF_CURVE_create_arc(&arc_coord,&arc));
    UF_MODL_create_list(&objects);
    UF_CALL(UF_MODL_put_list_item(objects,arc));

UF_UI_specify_vector(message,&mode,UF_UI_DISP_NO_VECTOR,direction,origin,&response);
if (response == UF_UI_OK )
{
UF_CALL(UF_MODL_create_extruded(objects,taper_angle,limit,point,direction,UF_NULLSIGN,&features));
}
else
{
return;
}
goto l10;

    /* Terminate the API environment */
    UF_CALL(UF_terminate());
}
/*****************************************************************************
**Utilities
*****************************************************************************/
/* Unload Handler
**   This function specifies when to unload your application from Unigraphics.
**   If your application registers a callback (from a MenuScript item or a
**   User Defined Object for example), this function MUST return
**   "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload( void )
{
    return( UF_UNLOAD_IMMEDIATELY );
}



admin 发表于 2015-8-3 12:49:49

你旋转了坐标系,实际上就是更改了wcs

你创建的点应该是 绝对坐标系下的,所以需要转换成工作坐标系的再看,另外,通过vector选取的矢量是不是也是绝对坐标系的 也要进行转换

这个你需要多试试,首先把你通过uc1616选择的点坐标打印出来看看,必要的时候去转换,圆弧的生成比较复杂,需要一个支撑平面的,如果是XY平面,也应该是wcs的XY平面,所以看来你都是在绝对坐标系下处理的,把改转换的都转换下,再看!

admin 发表于 2015-8-3 12:51:57

UF_CSYS_ask_wcs(&oldwcs);                              
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
UF_MTX3_x_vec(matrix_values,x_vec);                  
UF_MTX3_y_vec(matrix_values,y_vec);
UF_MTX3_z_vec(matrix_values,z_vec);
UF_MTX3_initialize(x_vec,y_vec,mtx);               
UF_CSYS_create_matrix(mtx,&mtxid);
UF_CSYS_create_csys(csys_origin,mtxid,&csys);   
UF_CSYS_set_wcs(csys);


这段代码,没什么意义吧, 你可以看见你创建的csys 并没有跟wcs关联

不需要这些代码
页: [1]
查看完整版本: 绝对坐标系下此功能成功,转动坐标系后失败。