查看: 4744|回复: 2

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

[复制链接]

7

主题

9

回帖

228

积分

培训VIP会员

积分
228
发表于 2015-8-3 10:49:22 | 显示全部楼层 |阅读模式

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

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

×
       请大家帮忙看看,我做了一个点对话框,选取点的位置后会生成一个圆,之后弹出一个矢量对话框,选好矢量后会拉伸这个圆(因为圆在xy平面最好选z轴正向或负向)。绝对坐标系下是成功的,坐标系也转换了,转动动态坐标系后失败,不在点选取的位置生成圆,圆的位置到处跑。以下是代码,大家帮忙看看。2 z5 ~( }+ [5 L: J/ Z) p% _- F
    #include <stdio.h>6 E. Q/ E, s- r; b
#include <stdarg.h>
7 q* m8 p) w3 C#include <uf.h>8 [- S4 f3 v7 n+ O2 f8 T
#include <uf_ui.h>9 E- o$ Y0 a% p4 ~5 E
#include <uf_curve.h>8 v' Y0 [) Z, A5 X1 h# m. n  r. O8 l
#include <uf_modl.h>3 _( d8 |9 I; H  K) X3 b3 A) b0 M
#include <uf_mtx.h>: O# o% ^0 f; O, X
#include <uf_csys.h>3 [+ q3 ^3 F. T2 [, u% N9 O
/ F/ ]- |/ C- C+ i2 c  M
static void ECHO(char *format, ...)) B, E) k7 r* Z$ a4 T, @
{
7 j  c( z% e* @2 j0 j8 \1 \+ }6 |    char msg[UF_UI_MAX_STRING_LEN+1];) K- l9 r! e$ J! E
    va_list args;
- G" N* @  g$ p; o+ m" Z0 E5 ~8 D    va_start(args, format);$ T- k+ F, _$ N4 u4 {1 p8 O
    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);) _$ h* r& e$ L( Z) K0 n- \+ ~
    va_end(args);  q5 b( C( r# K, T7 a6 q  t
    UF_UI_open_listing_window();
* X; n/ s) J: s* g: d. y% ^: m    UF_UI_write_listing_window(msg);: o6 ~8 x4 I3 h) `9 N5 k
    UF_print_syslog(msg, FALSE);
/ X3 N) s! n( m}7 s1 C4 t$ p; D7 E' _
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
, E; `. a7 h1 E# j7 m# C4 ^static int report_error( char *file, int line, char *call, int irc). h- q8 y3 k& o& I' H
{
) U+ F2 c+ l; n; G9 E7 Y- n; J    if (irc)7 T9 G; x' F6 d7 ?
    {# v' o& Z8 u2 b+ _9 U
        char err[133];
; T5 `4 @' z- K# \+ \- [$ S        UF_get_fail_message(irc, err);
# N" W8 v( e3 e. m  ?; G5 v        ECHO("*** ERROR code %d at line %d in %s:\n",
2 J' L2 g7 u- _7 l            irc, line, file);% x2 S% F0 O5 u
        ECHO("+++ %s\n", err);
+ `1 N( L, g. ?& [        ECHO("%s;\n", call);
, G4 N* |  u8 W) i' o    }* ?, E& R, L- f
    return(irc);
9 u. X: n) N* M0 v}
+ }4 ]$ \: v! K2 U! ^. u3 r$ u
9 ~7 G. I- u$ r( s/ a( y1 q' z/*****************************************************************************0 w7 j# |2 O0 R
**  Activation Methods
8 X( r9 l  W5 D/ d( t  n. O5 z*****************************************************************************/
5 a' g1 F0 Q# E  {$ ^/*  Explicit Activation0 E7 v8 R( i7 t( I
**      This entry point is used to activate the application explicitly, as in
- N5 c7 e. R( c/ h0 c* \  s**      "File->Execute UG/Open->User Function..." */
, m0 l, }- I+ R  R) G! H( r; v  N( s+ |) W% A! m3 @

* h3 H% T% C6 c0 v7 m: r. E; D  ptag_t oldwcs = null_tag;6 w7 c+ Z8 M2 `- g+ |+ {
double origin [3] = {0,0,0};
8 Q( |5 P2 @0 t1 f; mtag_t csys = null_tag;
7 J! ~" S4 Q; d3 ~+ d5 H, {3 ]tag_t  matrix_id; 5 b( }, Z1 z$ s9 J) c' y1 y* @# R3 T
double csys_origin [3] ;! t$ J, W# e+ P
double matrix_values [9] ;
* k8 |6 u' E* U( o$ r2 Kdouble x_vec [3];2 R! y( o  E; [0 |) u) c& G0 g5 _, N
double y_vec [3];
- q/ b2 y; c/ |( Z2 w9 w& Adouble z_vec [3];
3 X/ f2 X* V# \+ Y' Ldouble mtx [9];8 p5 z4 i/ R+ m  |6 o  g, d
tag_t  mtxid = null_tag;1 b0 B5 w7 K6 `' f" V. v
tag_t arc = null_tag;! f! _9 G) q% x9 a: Z4 ]# j7 k; Q) K: B
UF_CURVE_arc_t  arc_coord;
1 X$ T' |  y, u7 @* W, Idouble origincenter [3] = {0,0,0};# S4 b' b. M* R# k- {
uf_list_p_t objects;
' b) f' Q: Q& L0 c6 ?char  *taper_angle = "0";
2 \, R. _$ @) b) ychar * limit [ 2 ] = {"0","60"};
( ~6 D- X9 _, T! q& X) a/ ~, Udouble point [3]  = {0,0,0};+ j! [: d/ ]; `5 m# I3 u: z3 Q$ G3 S
//double direction [ 3 ] = {0,0,1};' @8 [/ v# S& d

. }. L$ ~" [0 B; w9 ^9 O$ muf_list_p_t features;3 Q* ^2 n9 Y' S
char * message = "vector";! ^" f6 P) k$ b0 R0 b2 N, b5 s0 y0 G
int  mode = UF_UI_INFERRED ;
: I! [8 z9 s( Y# g7 s. Ldouble direction [3]; , v* u2 f! t/ X/ k" Z1 S2 d
double origin [3];8 m" I% U# a: q: {6 J
int response;
% M' |* M7 W) i1 c* [2 g0 [$ v; Ochar * cue ="point";
: ~5 L" X& z0 U$ E, r- }int mode_sel [ 2 ] = {1,0};
$ r6 ]7 ~1 N; j; w# a- L& O1 e7 wint point_display_mode = 1;* G8 L/ y* W8 Q. g5 n3 e8 O2 p3 g
double point_sel [3];
9 w9 e5 S# p, }( u# z' s  w' H  H//double outputpoint[3];5 Y# K- o, g4 J6 P' c' d. c
1 w/ f/ @, y8 g- r* _
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )3 q& m9 T+ x3 ^: R" b+ v+ o
{6 ]! c3 p1 c, [- S6 [$ U6 P
    /* Initialize the API environment */, U6 H5 l0 Q# P1 }0 l
    if( UF_CALL(UF_initialize()) )
& n& G+ L+ q3 S) ~8 e2 Z% ^    {
) o. n% s1 t* W5 K& U        /* Failed to initialize */: o2 l/ L% {# F. \
        return;1 Z9 z8 Q8 T: O  t& d8 `9 k
    }6 S# _8 L& a5 K+ F" o
   
7 ^8 W, ~5 S( B) F8 P9 u5 Y    /* TODO: Add your application code here */
: e) I  S) j+ I/ v! s
2 m' c6 Z# w% r# q1 |; r: b% c6 p4 Y UF_CSYS_ask_wcs(&oldwcs);                              
1 J8 F0 \& g- ~+ h; j UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   7 y: t6 L& p2 l0 p
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);    , x( Q# H6 H/ A
UF_MTX3_x_vec(matrix_values,x_vec);                  
% J" ~6 y" k3 E  |$ Q UF_MTX3_y_vec(matrix_values,y_vec);( z# b" E0 g+ B6 E3 c3 `
UF_MTX3_z_vec(matrix_values,z_vec);
' W6 g( n, Z  n1 R* n+ E UF_MTX3_initialize(x_vec,y_vec,mtx);               ! ~9 d# D" p' @& x! ], u
UF_CSYS_create_matrix(mtx,&mtxid);4 x1 `0 D- Z$ R2 X
UF_CSYS_create_csys(csys_origin,mtxid,&csys);   
% u# C- d( l( h& B+ d) K( v+ A6 Y UF_CSYS_set_wcs(csys);  
- j0 N6 e( [$ y) d
' W: @; ]( P8 K. R3 h/ q$ |- Z. c. U2 ]5 d) E
l10:
. T: X2 r+ @. G, n    uc1616(cue,mode_sel,point_display_mode,point_sel);" f5 t/ K+ l) R6 F; s2 @2 ?
//UF_CSYS_map_point(UF_CSYS_ROOT_COORDS,point_sel,csys,outputpoint);
4 ]: n; A8 k0 x( z5 E' F. Z
7 Z/ k9 @" W+ @- O0 C arc_coord.arc_center[0]=point_sel[0];
% ]) W" `1 R, ^; m2 u$ } arc_coord.arc_center[1]=point_sel[1]; 4 Z# E  Y& i* I6 l
arc_coord.arc_center[2]=point_sel[2];! q! ~- N1 q! j# z, w
arc_coord.start_angle = 0;
/ r5 T& y% b5 e, X* g arc_coord.end_angle = 360.0 * DEGRA;! r- K- ^3 w, i, S: {, X
arc_coord.matrix_tag = mtxid;: K6 T' @  w' s0 k4 W) Q4 v
arc_coord.radius = 20;
! i% i( Q8 W& r
. Y. L' r, @, P8 h4 E. l UF_CALL(UF_CURVE_create_arc(&arc_coord,&arc));
. b+ {/ }2 H, x8 [1 {4 X& T6 d5 I; P    UF_MODL_create_list(&objects);% r4 t) q# q% v5 ?3 @$ k
    UF_CALL(UF_MODL_put_list_item(objects,arc));. c9 Z( K* M1 y/ I3 r

4 |# z. v! @0 v1 {+ D9 h6 [ UF_UI_specify_vector(message,&mode,UF_UI_DISP_NO_VECTOR,direction,origin,&response);
! ]' v7 H( X, K if (response == UF_UI_OK )+ b0 M% v! y# }" f
{6 t  C' @5 V+ ^# K: B* g( r
  UF_CALL(UF_MODL_create_extruded(objects,taper_angle,limit,point,direction,UF_NULLSIGN,&features));' s& |1 M( @/ E  i% F$ T: J: s
}3 f4 B) a: S2 j
else
" v' [) R( L: s* y1 A. \0 o* f# [+ B {
' E5 D5 i' {: I! Y' Y  return;
3 f8 J! k3 V3 e% Y# o; x }
' o) J7 H5 q- P* `8 N, O goto l10;
8 Q6 u$ S+ U  ]9 m
! P  |) N, l# p9 a    /* Terminate the API environment */
; H( d! @+ b1 a' e) B1 H6 I    UF_CALL(UF_terminate());
/ v; {$ p4 x7 J% A}
6 P1 G5 |8 p$ S9 b, h" U) q2 ^/*****************************************************************************) O* o# f  M% l0 \, d" I
**  Utilities% @9 c; S1 `, E3 @: u, V
*****************************************************************************/! x4 O/ B% d- d8 l) r6 m2 V. M
/* Unload Handler& ^0 ~/ _5 [$ R6 v% a( X3 }+ L
**     This function specifies when to unload your application from Unigraphics.% [) p; j' I% \% V
**     If your application registers a callback (from a MenuScript item or a9 [$ C% Z. E. u
**     User Defined Object for example), this function MUST return4 ?2 P! y  w5 m" p, w9 X
**     "UF_UNLOAD_UG_TERMINATE". */
. ^1 `- T3 M) O) ]% z# Dextern int ufusr_ask_unload( void )
# N* ?; M; t" s" u{
4 n# E% K. e& _7 Q    return( UF_UNLOAD_IMMEDIATELY );# R9 o, Y% E0 ?" G
}
  i- _# M/ X5 p4 u& D& x1 _) ~8 ~7 C; l$ ~1 K  k
4 F: p  q1 B$ J" \

& B: R9 _4 _) x

绝对坐标系下成功

 绝对坐标系下成功

转动坐标轴

转动坐标轴

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

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

使用道具 举报

4

主题

3

回帖

48

积分

管理员

积分
48
发表于 2015-8-3 12:49:49 | 显示全部楼层
你旋转了坐标系,实际上就是更改了wcs* x. t- `4 A7 c/ B4 h

3 |; \" f6 _& n你创建的点应该是 绝对坐标系下的,所以需要转换成工作坐标系的再看,另外,通过vector选取的矢量是不是也是绝对坐标系的 也要进行转换
3 m" g3 b# ]. G1 P/ s0 w/ n( q0 y! y7 V
这个你需要多试试,首先把你通过uc1616选择的点坐标打印出来看看,必要的时候去转换,圆弧的生成比较复杂,需要一个支撑平面的,如果是XY平面,也应该是wcs的XY平面,所以看来你都是在绝对坐标系下处理的,把改转换的都转换下,再看!
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

4

主题

3

回帖

48

积分

管理员

积分
48
发表于 2015-8-3 12:51:57 | 显示全部楼层
UF_CSYS_ask_wcs(&oldwcs);                               ' x& z7 x, ]: y0 N8 r, ]
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   ; X$ J! v' T+ d5 f
UF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
' g$ j5 r' q3 w2 M8 @UF_MTX3_x_vec(matrix_values,x_vec);                  8 N/ N/ N& P1 E) h6 p' M
UF_MTX3_y_vec(matrix_values,y_vec);& f' D' o5 Q' r
UF_MTX3_z_vec(matrix_values,z_vec);
* ?3 Q: r! X9 Q+ U5 W! |* ], iUF_MTX3_initialize(x_vec,y_vec,mtx);               
  O/ m& n, {8 m) r0 Q5 ]; cUF_CSYS_create_matrix(mtx,&mtxid);
9 c! o- E2 _" w9 x! ]UF_CSYS_create_csys(csys_origin,mtxid,&csys);    3 `5 `4 b* Q/ j6 m
UF_CSYS_set_wcs(csys);  . y) [3 J/ k2 B' z
1 q$ r) i; M2 |1 F8 `9 |
' }- C" E: ]7 g# w1 V) R% r
这段代码,没什么意义吧, 你可以看见你创建的csys 并没有跟wcs关联
  T- P& H  G8 o3 p/ A1 [; c' e$ a& w, E3 r' u* S
不需要这些代码
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部