PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

秋爱 楼主

2015-8-3 10:49:22

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

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

x
       请大家帮忙看看,我做了一个点对话框,选取点的位置后会生成一个圆,之后弹出一个矢量对话框,选好矢量后会拉伸这个圆(因为圆在xy平面最好选z轴正向或负向)。绝对坐标系下是成功的,坐标系也转换了,转动动态坐标系后失败,不在点选取的位置生成圆,圆的位置到处跑。以下是代码,大家帮忙看看。
$ j% a2 Z( p1 F( ^    #include <stdio.h>; d* H/ C/ A6 A  S' S- d' b( v
#include <stdarg.h>$ `, P  C$ n/ V$ W3 ]1 ~
#include <uf.h>- ~- v- p, _6 g) d- a
#include <uf_ui.h>1 A* B9 g- J& X7 o) u- v0 A6 j( u
#include <uf_curve.h>
! }0 }+ ^) B1 ~* {#include <uf_modl.h>; D- t4 k; T! ]  L# K$ Q4 I  e
#include <uf_mtx.h>
& x& h" l0 @4 a/ r#include <uf_csys.h>2 U# t# g, I1 R$ X
8 P6 l2 {9 n5 P" t% H
static void ECHO(char *format, ...)& l, \+ O; H" K; h7 I$ E
{4 a' m/ n4 E1 N& c9 X. i
    char msg[UF_UI_MAX_STRING_LEN+1];
- y6 @: l7 G0 `# k    va_list args;7 i% y$ k6 U( ~
    va_start(args, format);
/ [2 f; u  ~6 a5 ]. L    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);0 H" I9 @/ O8 S; \% i: M) q, `
    va_end(args);6 r. {: d1 N% R8 w) v
    UF_UI_open_listing_window();3 o& H( d1 w9 B- B! @" @
    UF_UI_write_listing_window(msg);3 R* f5 z5 y) n; n1 K- M3 z8 F3 d
    UF_print_syslog(msg, FALSE);
: J6 S3 n9 v7 j( _. C}
7 K1 `0 S7 B! ?8 X( g#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
6 }/ z' }5 ~* v3 h5 bstatic int report_error( char *file, int line, char *call, int irc)
6 g) l( u' ]; Z$ r: E' C{
2 G; E1 A. r  x) c) y, p. w    if (irc)
2 M" `& K' x) k! @* b    {% p$ \1 @" z. V' U* I
        char err[133];  T% j  T6 H" s& u# i6 e- E
        UF_get_fail_message(irc, err);
6 M4 S% Y% ]6 D        ECHO("*** ERROR code %d at line %d in %s:\n",
  |* d& l. J# U  f9 H; M            irc, line, file);
) R, j( k3 f3 D* G: u        ECHO("+++ %s\n", err);6 a! v2 f* i% q. A4 ]" i+ q
        ECHO("%s;\n", call);7 r3 U% F! ~/ o6 \/ k
    }" I1 G0 v5 {# H  D$ E! [% `0 N/ i. m6 O
    return(irc);
$ t% h$ t- g. K}
& P6 g" @& d9 d. h3 L+ D# G4 r2 n9 G* k& o
/*****************************************************************************; g; u9 V6 W# b" e' W
**  Activation Methods' d2 W  r# |( A! P
*****************************************************************************/
+ ]; r& {5 W" F0 y9 B3 [/*  Explicit Activation* [3 V; Z* k/ F
**      This entry point is used to activate the application explicitly, as in* h' g5 F4 F) V1 Z
**      "File->Execute UG/Open->User Function..." */8 J* ]# g: |) E! Y
' T) C, H1 ^. C% _

+ ?! d0 n3 v" ^* B: a$ qtag_t oldwcs = null_tag;* [; x! o, [: n& ?  |9 X# I
double origin [3] = {0,0,0};6 U; w. h. k  Z
tag_t csys = null_tag;! g- o2 a7 ?( c1 c( H) z/ ]
tag_t  matrix_id;
) o- F2 l6 x5 r9 I4 cdouble csys_origin [3] ;
% F; X! e4 w4 B' o2 o+ `0 R! Ddouble matrix_values [9] ;
* U0 L& |" f$ ]2 H2 odouble x_vec [3];! i, K$ g9 g, {9 _5 W9 Q; V$ J
double y_vec [3];! `  L' ?# I. @! W
double z_vec [3];* l; r! V9 r4 T5 Z, I
double mtx [9];
$ k+ I+ [+ ^1 {2 w: ntag_t  mtxid = null_tag;
) ?: H/ z  G  Qtag_t arc = null_tag;) F4 ?! J* n; B* e7 v* F
UF_CURVE_arc_t  arc_coord;
/ l" t7 {/ T) q5 j0 @double origincenter [3] = {0,0,0};+ W  _5 N- Z2 ^3 k
uf_list_p_t objects;
/ A  \8 j! _) vchar  *taper_angle = "0";
( ?/ y' I) a/ ~9 P. Pchar * limit [ 2 ] = {"0","60"};9 `- ]! _, `" k
double point [3]  = {0,0,0};: h0 i, ~! b6 p7 I  F# W, n( _8 s
//double direction [ 3 ] = {0,0,1};- k+ g4 i0 ^3 p
  ?& b; H. I( `( ^, L
uf_list_p_t features;/ w$ n% s# t* J
char * message = "vector";
; n9 e9 w% U$ S' _7 H. O6 F( ?int  mode = UF_UI_INFERRED ;
& e; R3 h$ Y+ R6 z# H8 I; {- U( Bdouble direction [3];
  N/ L4 u3 G- {' Fdouble origin [3];
- X& A2 F1 {- O; E1 ^int response;
4 |" \* [2 r/ H/ }char * cue ="point";
" v; l9 G8 R8 ]" y, F  Yint mode_sel [ 2 ] = {1,0}; 1 j, S8 h4 E) ~3 J; p
int point_display_mode = 1;
" N# |# o7 y% J: B) x0 d* kdouble point_sel [3]; 6 C5 l" O% L# @8 c# b  o
//double outputpoint[3];
/ j, [  I( p; j1 _: p. ^; F' x
1 B, G. |+ j" ]7 T0 qextern DllExport void ufusr( char *parm, int *returnCode, int rlen )2 S& ^/ H% @- U9 A! E9 |4 h
{( ~! i( l5 H/ y; ]8 x; |0 T
    /* Initialize the API environment */: r: d7 Y. V+ [, S* \  Y
    if( UF_CALL(UF_initialize()) ) , b6 h1 s+ _' g* K! r
    {  |6 x+ Y/ l: Q6 A' m9 d
        /* Failed to initialize */8 H! K/ {5 h! N- l) B
        return;
7 \  L! W% j1 O4 E    }, O  `2 G8 ^$ ~3 Y
    9 Z6 s( |" G7 I, f
    /* TODO: Add your application code here */0 _+ _( c% ~7 R+ w
6 i+ m9 A+ V. U
UF_CSYS_ask_wcs(&oldwcs);                               & O4 m+ |; K4 |  @# c  N
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   1 k5 B8 y# a) Q7 A
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
& E9 m( r* s5 n$ n' Q UF_MTX3_x_vec(matrix_values,x_vec);                  
8 J! u' y0 [+ Q) b/ q6 `: K UF_MTX3_y_vec(matrix_values,y_vec);
+ s4 \& F+ Y& r$ { UF_MTX3_z_vec(matrix_values,z_vec);' {1 _. Y+ Z+ y) `' h5 v5 J
UF_MTX3_initialize(x_vec,y_vec,mtx);               4 s9 x" t: h: N! B5 z
UF_CSYS_create_matrix(mtx,&mtxid);) v, H4 t5 g+ L: M+ g
UF_CSYS_create_csys(csys_origin,mtxid,&csys);   
# \( b* K( u# L6 S7 |, S* }8 @, \- S% Z UF_CSYS_set_wcs(csys);  7 r. ]+ ^! L4 |, Z( Y% o0 ^

+ r% U; o8 p0 H- n  p
! R2 B" d+ Z  z' F; S1 il10:% t' O- B" Y; {+ {" H
    uc1616(cue,mode_sel,point_display_mode,point_sel);
! p3 a8 z. o3 t  s //UF_CSYS_map_point(UF_CSYS_ROOT_COORDS,point_sel,csys,outputpoint);
5 t" n: N$ g3 m8 K  K9 M
( \# q6 L7 x5 ]( L arc_coord.arc_center[0]=point_sel[0]; : o$ ~0 X- r* p9 [5 M
arc_coord.arc_center[1]=point_sel[1]; : S3 U5 S4 C, M$ [
arc_coord.arc_center[2]=point_sel[2];+ s" n; }. X$ g7 V* x$ k. u, ~
arc_coord.start_angle = 0;
) ~. m0 D! [5 L2 e arc_coord.end_angle = 360.0 * DEGRA;
! n- N  k- R) @. c* }( ? arc_coord.matrix_tag = mtxid;1 i5 r4 S2 T3 O1 r. D* R4 e; Z
arc_coord.radius = 20;
- F5 j' {: ^+ l9 a* V) y4 i
6 b+ O7 v+ d. P+ e UF_CALL(UF_CURVE_create_arc(&arc_coord,&arc));" w" x/ C1 \& D, _2 h
    UF_MODL_create_list(&objects);5 ?9 Y3 X8 ~! g0 y) d
    UF_CALL(UF_MODL_put_list_item(objects,arc));; [8 S. b4 V: r9 h$ l+ n& `* x) z
  S" Y$ `; s2 o! w' D& V8 }- o
UF_UI_specify_vector(message,&mode,UF_UI_DISP_NO_VECTOR,direction,origin,&response);
3 I7 ?% z  f0 ^8 y if (response == UF_UI_OK )+ d! ~- D% P8 I8 y# C' w$ }* ?
{/ o9 d6 `* @0 W
  UF_CALL(UF_MODL_create_extruded(objects,taper_angle,limit,point,direction,UF_NULLSIGN,&features));
$ b- S- n7 o. i7 v* Z, w$ W }
' C) f: J2 K: G; y: g! s" b else
- i- f5 d, C) n8 d4 u6 W" h {
  S; [6 s0 G0 E, J/ l1 t  return;
$ E9 i' y5 c5 y; }# J" N }4 @# k' o6 E3 s, f
goto l10;3 J' G6 g' `# O

; P- _+ ?8 _4 S- Y    /* Terminate the API environment */
$ y2 v& F8 C- c: p8 ]+ a8 {    UF_CALL(UF_terminate());" o' V) B+ c4 L7 F
}* s5 T- p1 K) b  H5 m. ~
/*****************************************************************************
. M5 M+ n* v1 S5 P0 X8 ^/ A7 K' E**  Utilities
4 x, E% @7 y  n, o) ?1 X*****************************************************************************/6 n0 l- {7 H7 T  ]- n( n( b
/* Unload Handler. ~6 E/ w6 A# ^* B% y& ]
**     This function specifies when to unload your application from Unigraphics.! o6 L% x- o0 _
**     If your application registers a callback (from a MenuScript item or a/ s. f# \1 o4 M+ ?& _0 \
**     User Defined Object for example), this function MUST return! G( s9 N+ b/ h4 W1 Y' `; T" P
**     "UF_UNLOAD_UG_TERMINATE". */
' C1 I- U! l: i4 |( ^2 h! jextern int ufusr_ask_unload( void )
) l4 T. U. r( K6 e; }{
9 c, e7 l( y3 W- \# L* b6 r& u# }    return( UF_UNLOAD_IMMEDIATELY );
- Y9 l1 @' F% [$ P- ?}6 j/ X- D$ E+ }1 V; w: m$ q4 f
* B" K% q' G0 \- g6 B& C4 \
0 v  c  D& q) p
4 E" T3 ]3 v; a$ s. \, l1 t

绝对坐标系下成功

 绝对坐标系下成功

转动坐标轴

转动坐标轴

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

点的位置在圈出的位置,圆位置不定。
上海点团信息科技有限公司,承接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

你旋转了坐标系,实际上就是更改了wcs
" v4 q# ]1 ]8 W7 S- H  {0 U" Y
3 C/ ?- x# r% y8 M: h你创建的点应该是 绝对坐标系下的,所以需要转换成工作坐标系的再看,另外,通过vector选取的矢量是不是也是绝对坐标系的 也要进行转换- ~! i  V0 a( ^5 E* R2 ?

! N. d" S% p* c% C这个你需要多试试,首先把你通过uc1616选择的点坐标打印出来看看,必要的时候去转换,圆弧的生成比较复杂,需要一个支撑平面的,如果是XY平面,也应该是wcs的XY平面,所以看来你都是在绝对坐标系下处理的,把改转换的都转换下,再看!
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

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

admin 板凳

2015-8-3 12:51:57

UF_CSYS_ask_wcs(&oldwcs);                               . e! J# _- a9 P! k6 c2 G, K
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
' c& [( P- S8 m. y+ m! E: h3 bUF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
$ w: L$ T$ }( ~7 u1 N% gUF_MTX3_x_vec(matrix_values,x_vec);                  % C  z$ X. v1 ?* k5 _
UF_MTX3_y_vec(matrix_values,y_vec);; E0 U; `5 i- \1 p3 R4 E# v* |( `1 _4 P
UF_MTX3_z_vec(matrix_values,z_vec);
& T5 `. X3 i! s) ?3 {UF_MTX3_initialize(x_vec,y_vec,mtx);               
1 i  Q$ b' c' fUF_CSYS_create_matrix(mtx,&mtxid);
% I* Y; e9 b; k4 I4 Q1 ]9 q7 q" PUF_CSYS_create_csys(csys_origin,mtxid,&csys);      P, b( x8 I& \% K+ W- I( p6 M# A
UF_CSYS_set_wcs(csys);  ! F% ~$ ^5 ?2 U- A/ t% S: T

: S* v1 U. ?2 j* P5 v3 n/ t1 w% y; ]* i, z( W2 O, v8 K5 K( N
这段代码,没什么意义吧, 你可以看见你创建的csys 并没有跟wcs关联
' x$ Y, U5 j0 q* [: c. s' M$ P
( p6 Z2 [# R2 d) e" L" @不需要这些代码
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了