PLM之家PLMHome-工业软件践行者

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

[复制链接]

2015-8-3 12:51:57 4529 2

秋爱 发表于 2015-8-3 10:49:22 |阅读模式

秋爱 楼主

2015-8-3 10:49:22

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
       请大家帮忙看看,我做了一个点对话框,选取点的位置后会生成一个圆,之后弹出一个矢量对话框,选好矢量后会拉伸这个圆(因为圆在xy平面最好选z轴正向或负向)。绝对坐标系下是成功的,坐标系也转换了,转动动态坐标系后失败,不在点选取的位置生成圆,圆的位置到处跑。以下是代码,大家帮忙看看。1 B2 ~" T" P- x/ \" }0 x& f! V
    #include <stdio.h># ~4 ~( }2 [1 y  e( _
#include <stdarg.h>4 K5 O& Z- h, u3 h; E( I1 c
#include <uf.h>
7 _* c7 [6 T: X  }7 X! \+ t#include <uf_ui.h>
0 i2 @- P. _9 A! I#include <uf_curve.h>
; I+ y& y$ s& T  v2 V#include <uf_modl.h>1 d' z$ Q/ {! Z
#include <uf_mtx.h>4 d# k  {6 m3 A, h
#include <uf_csys.h>
* \: B) s- ~$ r, A. J, m/ a5 Z3 \# N* R" |( t9 d! A( o
static void ECHO(char *format, ...). _( E$ _) A1 @; G! [
{
- t! p) i4 `- K; ]' K  Q    char msg[UF_UI_MAX_STRING_LEN+1];
; W/ R7 l4 D0 }% F% F5 e    va_list args;
( c6 z. w6 I$ l' r/ [' U    va_start(args, format);
3 h' f/ l, {6 I: x- u    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);- P+ H$ B. q1 Y6 A
    va_end(args);
2 h4 {) R) e; k9 p6 d) c5 l    UF_UI_open_listing_window();
% v8 e. I) H) k& q, A- J3 G    UF_UI_write_listing_window(msg);
& o/ U+ D9 W) O6 O( U; }    UF_print_syslog(msg, FALSE);
1 w6 [! A( ?& ^7 B1 C}  f) x( e# C6 @- }$ B
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))); {4 o% }$ k& N- R
static int report_error( char *file, int line, char *call, int irc)
3 G$ o& Q% B6 g% M{* N2 U; x3 R( \& p
    if (irc)
" D3 Y2 ^+ U( e; I    {
% _# I7 M; v. A5 M: m        char err[133];
0 i* O8 L: N, b        UF_get_fail_message(irc, err);
/ N  `7 `" h+ @+ o        ECHO("*** ERROR code %d at line %d in %s:\n",
  c/ l  [; o' }8 i5 I" u* u4 Y            irc, line, file);' X9 G2 y2 l% o5 D8 Q/ L
        ECHO("+++ %s\n", err);) w; _+ @) N! U/ F3 Q2 ^
        ECHO("%s;\n", call);" _; V# y! z. t/ t. u
    }
8 B0 g. ^1 Z8 V0 G  a# t/ D2 `    return(irc);7 G! _' U3 [% O$ j
}
" z2 a2 u* R6 K" I% Y$ E
! g3 |5 W. y( u& r- |6 }! D# V- Y+ B) o/*****************************************************************************
/ ^& O7 s" D0 h5 T* _7 J, E**  Activation Methods
& k. c7 p* d: ]  ?9 X*****************************************************************************/  S! y/ U' ~1 A/ s1 H1 p6 c( h+ f5 r
/*  Explicit Activation
! I* y6 ^  o/ Q# H  L5 p**      This entry point is used to activate the application explicitly, as in! P! W- r1 Z5 ~( F1 A6 L
**      "File->Execute UG/Open->User Function..." */
% j( [1 l, t8 i9 k4 O# O5 d2 c0 E# A5 j- z( C) o% T, K) V
$ ~4 j+ a& l4 t5 g6 a; g/ l
tag_t oldwcs = null_tag;5 P0 ?2 U% p- Y3 P+ Y
double origin [3] = {0,0,0};$ _" V1 B5 Y8 F! w0 t0 A
tag_t csys = null_tag;
% g9 T* L3 o. o* P% Ftag_t  matrix_id;
2 ^' u  b- u# x" h; Ndouble csys_origin [3] ;
, C) @! M4 P5 C% t3 `# N4 @& L* udouble matrix_values [9] ;
3 @+ u, m9 E, L1 Q2 a1 Ddouble x_vec [3];, S4 \; F# b( {4 m" Z7 |& V
double y_vec [3];0 d; h/ D: P/ o9 U# R% t9 q* t; `
double z_vec [3];
& j, X# q& ]! t5 wdouble mtx [9];
' p8 a9 ~# K8 w1 b7 ztag_t  mtxid = null_tag;
# S# k9 X9 Y) O& s! x7 K$ L3 \tag_t arc = null_tag;
0 ?: n" a  \, eUF_CURVE_arc_t  arc_coord;
! n& k. [! v2 J, w/ O5 W5 a% {double origincenter [3] = {0,0,0};
/ t, D' Z5 J2 `" i. L+ ruf_list_p_t objects;
/ T- ]' S9 M  ~# E% k& ochar  *taper_angle = "0";$ R) V' X; J. |6 d3 [: V$ B/ Y
char * limit [ 2 ] = {"0","60"};7 I% @( E9 h' S; a* Y' u* E% w
double point [3]  = {0,0,0};
+ C3 I* L, o0 d4 b# X1 w  @* o//double direction [ 3 ] = {0,0,1};
+ k& b% Z6 X/ ^5 W0 g/ ?
! V$ i; m' X/ H! l( s8 Q6 W* Uuf_list_p_t features;
# m1 A8 z+ q& uchar * message = "vector";! y. [/ D* {5 Q2 p1 q2 M
int  mode = UF_UI_INFERRED ;
; X, f" ], X. D( l9 `double direction [3];
. S6 t; @- Q* h( D: s4 idouble origin [3];
4 C, U' _4 Z; Sint response;/ \: @  c6 F7 T- ?! O, q
char * cue ="point";
3 J6 N4 k6 C) V4 N' hint mode_sel [ 2 ] = {1,0}; ; C2 ~( I8 o2 M) E" A$ ?
int point_display_mode = 1;
3 c- I$ [# s( m0 q7 idouble point_sel [3]; 7 u3 O. G% Y' p4 u
//double outputpoint[3];& C, t* u6 k! k7 D7 R3 X
. |2 R; {; J2 z6 L1 ^% x
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
. N, X  A0 k" y, R( t6 @{
; _- v$ h3 F) A# y) x  |  a' J    /* Initialize the API environment */( k; R2 ]% t& U2 e: l" Z. N
    if( UF_CALL(UF_initialize()) )
: Y* E) K9 F. T$ z( _5 W    {4 P5 i; v* M% q8 M8 i
        /* Failed to initialize */% J" V' k6 y( }: b. X5 T
        return;
! Y/ d  Q/ F2 h9 a/ b2 B0 ^& o7 U    }
5 Q4 o) o7 \2 U5 I' B    % o4 f9 [5 P( o9 p2 \$ \
    /* TODO: Add your application code here */
3 ?( c! f: X$ Z- |/ R( z+ b5 a
4 {3 c' o+ h3 _5 ]. N3 m9 X2 Q UF_CSYS_ask_wcs(&oldwcs);                              
5 G- c4 [* _2 t6 D3 _5 u4 I( s UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   ; S$ ^. y5 X- X! W; e, d  C; [
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);    0 X) A$ c/ j9 u# M
UF_MTX3_x_vec(matrix_values,x_vec);                  
& u" x/ B" L- I0 f6 G. w UF_MTX3_y_vec(matrix_values,y_vec);
3 |- J& u( f7 Q  C% a UF_MTX3_z_vec(matrix_values,z_vec);+ H$ c& F- C/ _8 _  T
UF_MTX3_initialize(x_vec,y_vec,mtx);               3 J! ~- j8 h! f0 j
UF_CSYS_create_matrix(mtx,&mtxid);
& w2 E7 U/ t5 P3 P0 m UF_CSYS_create_csys(csys_origin,mtxid,&csys);    # t4 _6 {( j' ^. B
UF_CSYS_set_wcs(csys);  : L% h0 z8 D0 Z7 V& T) O$ q" k

- ^8 j8 l; P) m: R: E% t* m! F2 z* A7 [5 |3 g5 y7 O
l10:$ q/ w6 B* _( a( \( C$ N
    uc1616(cue,mode_sel,point_display_mode,point_sel);
7 H; C0 e/ Q" Y2 }. h6 q3 T //UF_CSYS_map_point(UF_CSYS_ROOT_COORDS,point_sel,csys,outputpoint);+ }7 j9 B( E& s

, \0 T6 ?% N$ T1 x- o7 A arc_coord.arc_center[0]=point_sel[0]; 0 ^9 A4 t0 {9 U* }* ?- z
arc_coord.arc_center[1]=point_sel[1]; " G3 V* K2 M3 Y9 o) h, ], g/ i) K
arc_coord.arc_center[2]=point_sel[2];
  Z7 o$ j: ~2 X3 Y2 }* g/ @ arc_coord.start_angle = 0;
" b6 d3 V# ~) `, x0 A- r arc_coord.end_angle = 360.0 * DEGRA;  w* ]1 x0 y8 w
arc_coord.matrix_tag = mtxid;
  H; z1 D5 C; m$ e$ G/ Y arc_coord.radius = 20;! Z) `7 |+ E% b$ J, [

: w) n+ T  w# F& T. P. n. h UF_CALL(UF_CURVE_create_arc(&arc_coord,&arc));6 D. [; K% {, K' F7 b' w
    UF_MODL_create_list(&objects);% W9 Y/ {, g9 T- Q  R: r9 C
    UF_CALL(UF_MODL_put_list_item(objects,arc));
& `; @; ?7 A7 {2 [, F+ \8 N9 {
, V, Z* m) H9 m7 ~8 | UF_UI_specify_vector(message,&mode,UF_UI_DISP_NO_VECTOR,direction,origin,&response);7 C6 C, l. ]1 U0 V1 |
if (response == UF_UI_OK )
4 m) a2 \+ J/ C6 r {6 q( h0 G' ?# r0 `8 j: y
  UF_CALL(UF_MODL_create_extruded(objects,taper_angle,limit,point,direction,UF_NULLSIGN,&features));
$ _) k# p$ e1 v8 |0 L. V5 M3 ` }
) ~7 W* Z% U1 @! T0 C% ~ else8 X7 m) [- u$ n
{( G9 x4 Y# k/ N% T
  return;
3 o9 m: x& {% z! x0 ]+ X }
, W  W% P0 B+ {. f( e goto l10;
. o7 {: L( j5 i, K  N" X* E* b* f7 M$ A2 y: b
    /* Terminate the API environment */2 l) |( }' k" }+ i
    UF_CALL(UF_terminate());
) w1 Z$ P: B: q; V$ J; d: P6 k+ n# u4 y}
% I3 c9 Q0 |* n3 S1 W- y1 S8 F4 `! M/*****************************************************************************
  I. h0 z! \, l% S**  Utilities3 }4 v. e2 f* n6 p
*****************************************************************************/2 M4 Q+ w% s2 I* O
/* Unload Handler& y1 P' z, y, t# Z2 R3 l( T
**     This function specifies when to unload your application from Unigraphics.
. ], l' L& j& {; G**     If your application registers a callback (from a MenuScript item or a: A8 i9 i* z) e1 q7 M
**     User Defined Object for example), this function MUST return
  C% Q5 V8 B+ N' X! d! s' Q* u**     "UF_UNLOAD_UG_TERMINATE". */
9 l" `. q1 ?  E3 xextern int ufusr_ask_unload( void )4 l6 P: _+ c8 p8 j
{/ |# _: E/ f; i/ l. C, n! l
    return( UF_UNLOAD_IMMEDIATELY );
; X8 v/ d; x5 X. f9 W}
& L/ i9 \6 n8 P: y, z9 a( v; R3 n4 M( n: D
1 y5 ^6 K5 ]9 b8 `1 r+ R1 y" h2 y
6 k0 z1 x6 X7 Z* o/ l) M

绝对坐标系下成功

 绝对坐标系下成功

转动坐标轴

转动坐标轴

点的位置在圈出的位置,圆位置不定。

点的位置在圈出的位置,圆位置不定。
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复2

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

admin 沙发

2015-8-3 12:49:49

你旋转了坐标系,实际上就是更改了wcs2 k, n. S7 I2 Q5 x8 b

5 O/ U# _3 v7 c, y你创建的点应该是 绝对坐标系下的,所以需要转换成工作坐标系的再看,另外,通过vector选取的矢量是不是也是绝对坐标系的 也要进行转换
( x$ @5 @% g. \/ X& H' ^/ L+ |, ~1 u$ X
这个你需要多试试,首先把你通过uc1616选择的点坐标打印出来看看,必要的时候去转换,圆弧的生成比较复杂,需要一个支撑平面的,如果是XY平面,也应该是wcs的XY平面,所以看来你都是在绝对坐标系下处理的,把改转换的都转换下,再看!
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复 支持 反对

使用道具 举报

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

admin 板凳

2015-8-3 12:51:57

UF_CSYS_ask_wcs(&oldwcs);                               5 ]$ W, K' z0 \+ O) p  J
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
/ z3 U& q6 D+ R' QUF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
3 u6 J, A- F  t8 b; DUF_MTX3_x_vec(matrix_values,x_vec);                  ! _% N) N6 H. m) x
UF_MTX3_y_vec(matrix_values,y_vec);
2 X! t- V/ }+ K- R' z' c# yUF_MTX3_z_vec(matrix_values,z_vec);8 p' _4 v/ ]5 n  C( v
UF_MTX3_initialize(x_vec,y_vec,mtx);               
5 I: J% ]2 r5 HUF_CSYS_create_matrix(mtx,&mtxid);
" }$ I& j. Y0 \+ {/ fUF_CSYS_create_csys(csys_origin,mtxid,&csys);    . `! F! ]: W* T2 `# W
UF_CSYS_set_wcs(csys);  3 h1 e9 {1 O$ l& \3 ]
/ [1 W& K* R. }- d+ M( C( q

' z, @1 M3 T# g% \. l: V  W& G* @# n% I这段代码,没什么意义吧, 你可以看见你创建的csys 并没有跟wcs关联
6 ?! N1 p+ M% \! }8 o$ f4 ?
( c, ~& ~9 P# W% P5 ]: a7 F% G9 P: ~  k不需要这些代码
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了