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

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

[复制链接]

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

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

秋爱 楼主

2015-8-3 10:49:22

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

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

x
       请大家帮忙看看,我做了一个点对话框,选取点的位置后会生成一个圆,之后弹出一个矢量对话框,选好矢量后会拉伸这个圆(因为圆在xy平面最好选z轴正向或负向)。绝对坐标系下是成功的,坐标系也转换了,转动动态坐标系后失败,不在点选取的位置生成圆,圆的位置到处跑。以下是代码,大家帮忙看看。& }, j$ D# ~( K
    #include <stdio.h>; w3 {% t) y# o+ U; r2 R
#include <stdarg.h>
4 j4 Z" ?# J1 w, ?: h) O* W/ g#include <uf.h>3 ^4 ~7 c% w, a$ @
#include <uf_ui.h>
: k3 \8 Y* H% g" ]6 Y  ], q- T. R, b6 C#include <uf_curve.h>, F( g6 x5 w5 B, {! A: @/ @
#include <uf_modl.h>
% y) ]/ @  G1 M7 o! a#include <uf_mtx.h>
0 W3 b* {$ v0 x1 p  X. V#include <uf_csys.h>) h6 J0 n- v2 c' A

5 q; j# M2 w; jstatic void ECHO(char *format, ...)
, {6 j5 S6 _, r6 {9 n& l  B{
" y9 D3 r/ l* H2 N2 Y1 |) q    char msg[UF_UI_MAX_STRING_LEN+1];8 O! Y  v; N2 }$ l  B4 p; D) o
    va_list args;
2 |% s6 m: W2 z3 l; g4 g. W6 [    va_start(args, format);* H1 S# N" @8 @# X* m
    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_LEN, format, args);
0 a5 W+ M' q/ Z& h- {+ y+ m8 g    va_end(args);
1 {/ U/ V8 O# f2 U# y, f    UF_UI_open_listing_window();
( Z( Z5 E8 j" k2 K    UF_UI_write_listing_window(msg);9 r2 E" g3 y) Z0 ~  O' A
    UF_print_syslog(msg, FALSE);. A, C4 g+ e: c! k/ T6 J
}( y! v) d0 H7 N: \: i- H
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))/ }; w0 L: M, a0 J( T- H- t
static int report_error( char *file, int line, char *call, int irc), ?9 q+ x$ E' K4 M/ i2 p
{
* A3 E9 P5 x: o$ V+ [6 T' G+ R0 J    if (irc)
' j  H7 W& ?4 d    {2 _& x* z2 L1 R  e; I, ~5 t
        char err[133];7 }" z! y8 o8 Y5 N. L0 u- e3 w
        UF_get_fail_message(irc, err);
+ D- r" Q+ E1 C5 V; y1 {* p        ECHO("*** ERROR code %d at line %d in %s:\n",# I8 r' E6 ]8 l- q
            irc, line, file);+ J8 U  a1 N$ ]% k6 n9 v+ ^. K& l3 I
        ECHO("+++ %s\n", err);/ e2 ^- q# x- ?$ q: W
        ECHO("%s;\n", call);; `- ]% k- \9 y
    }2 f% [2 R! |* y  e9 X
    return(irc);
/ Z" L  n+ U: j+ t. F1 N3 n}+ J% o0 w% ]+ u. u* _
3 }4 e; ?) ^, @4 \$ I
/*****************************************************************************' V) {4 u5 d) H: B0 t
**  Activation Methods
: M+ r& N3 w. Y7 U% X: b  A*****************************************************************************/) b' Z; \! a, X2 I
/*  Explicit Activation9 _/ \* ^) c3 i% `
**      This entry point is used to activate the application explicitly, as in! o; `7 [+ u- w* z" E: [
**      "File->Execute UG/Open->User Function..." */" j( u$ Z$ h0 l; D7 |" K6 [2 H
) X/ t3 Y  p1 ]) y) }# x9 x" K& L
8 W# V* t- q) A, P# y4 D
tag_t oldwcs = null_tag;
* Q5 I. I( M- ]; Adouble origin [3] = {0,0,0};0 a: F1 D* Y0 L/ x
tag_t csys = null_tag;+ t5 n# O% L) g# B. ]
tag_t  matrix_id; 4 R  a9 N/ b+ P0 L, T
double csys_origin [3] ;& h, ~9 ]  c- I3 Z
double matrix_values [9] ;
; _' U, c( O! F! Edouble x_vec [3];
# n% ~- T* F* `9 H3 E) t1 x% _* ^double y_vec [3];
9 i1 ?9 y' w# Rdouble z_vec [3];
- |5 `- r2 s7 W. _double mtx [9];0 r+ {5 a6 e5 F' A& L
tag_t  mtxid = null_tag;5 R* g: M1 _) a, y
tag_t arc = null_tag;$ g4 F: Y. z/ b) A
UF_CURVE_arc_t  arc_coord;
* w  ?8 F5 s. {3 O1 r  wdouble origincenter [3] = {0,0,0};
" c( r9 x5 N0 E6 guf_list_p_t objects;
6 q. i0 e+ s# b% Wchar  *taper_angle = "0";
* B, {+ t% x' Echar * limit [ 2 ] = {"0","60"};2 ]* s# B6 u7 H! ~+ k8 ?6 w9 v
double point [3]  = {0,0,0};9 [0 ^0 T- e8 B: g5 L; X
//double direction [ 3 ] = {0,0,1};( Q0 |) Q0 u* ~
+ Z& p0 U* f5 H& M3 Q. B8 B$ D
uf_list_p_t features;( Z" s) ^; N3 X7 R& n
char * message = "vector";; f* c2 I3 B9 m+ Y0 @
int  mode = UF_UI_INFERRED ;5 v4 [1 m! P$ i# l$ Z
double direction [3];
; r0 T' g* W% Y6 A6 i- S3 idouble origin [3];
" C3 g1 b- ?9 C+ G3 M1 lint response;0 l: m6 b5 Z1 [+ g6 q. D
char * cue ="point";4 y/ C" R& v! U  p8 H
int mode_sel [ 2 ] = {1,0};
& [7 V$ n3 A. r7 i* zint point_display_mode = 1;
+ O3 ~! j! m; a3 n7 u* S+ idouble point_sel [3];
) ~0 E3 F* g  E//double outputpoint[3];
8 K2 M0 }& f# o# a9 t
4 J. D) z' o6 I8 G! xextern DllExport void ufusr( char *parm, int *returnCode, int rlen )
+ P5 Y+ @. d# S6 N9 Y" |{
( `: ~, W7 n4 A4 Z9 K    /* Initialize the API environment */5 S- N& _* |2 }. I1 }2 c
    if( UF_CALL(UF_initialize()) )
4 c6 P6 v" \, J# `8 T) J    {
$ `# K9 E5 q" K4 t        /* Failed to initialize */
" o& l9 v/ x) ^( g        return;
$ W$ P+ P6 @( C, y& |+ |3 P/ p    }$ B3 I: \+ I7 R. I1 Z
    ! p7 N3 t$ n/ O' @
    /* TODO: Add your application code here */" Y& }: S( k0 B6 B

& ^) L9 o. u, e UF_CSYS_ask_wcs(&oldwcs);                               : a2 J3 I6 B. I
UF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
" S7 l# D, M9 J- _4 `" c UF_CSYS_ask_matrix_values(matrix_id,matrix_values);   
" C. ?9 y& C8 S; v& {8 T UF_MTX3_x_vec(matrix_values,x_vec);                  , ?& @  e5 }+ y! B1 J
UF_MTX3_y_vec(matrix_values,y_vec);' {2 U- n* z$ b* _
UF_MTX3_z_vec(matrix_values,z_vec);2 E  @( }" J& Q! z' s+ A2 j
UF_MTX3_initialize(x_vec,y_vec,mtx);               & }* X/ B; x1 C7 Y$ G
UF_CSYS_create_matrix(mtx,&mtxid);
$ ]$ o, I. O3 E& e% y+ ` UF_CSYS_create_csys(csys_origin,mtxid,&csys);    / @9 ~. {& t( P+ G; I/ G0 H
UF_CSYS_set_wcs(csys);  - e- ]% E% r2 v" t) j# g
$ q/ ?1 Z6 v% {7 B$ }
1 m- e5 T3 [  `, E1 d: v4 o5 ]
l10:
  h9 I! |: b$ w! h! X; X; m    uc1616(cue,mode_sel,point_display_mode,point_sel);/ Z2 }# X) P9 B$ r3 F
//UF_CSYS_map_point(UF_CSYS_ROOT_COORDS,point_sel,csys,outputpoint);- o5 ^4 b- N$ l$ q
- C  N0 W* y" `8 h% T
arc_coord.arc_center[0]=point_sel[0];
! ]! Z% y9 Y* m- J" i1 }2 B arc_coord.arc_center[1]=point_sel[1];
3 D& Y" \' G+ R$ l+ _+ p1 P arc_coord.arc_center[2]=point_sel[2];
& t/ j" r+ k3 k% v3 K3 [ arc_coord.start_angle = 0;: N3 H) G+ v# B2 f2 o
arc_coord.end_angle = 360.0 * DEGRA;" ~% v" L0 g4 j; b7 ~
arc_coord.matrix_tag = mtxid;
+ g# ~" \7 T$ }3 ~+ \0 N7 @9 m3 P arc_coord.radius = 20;  K+ _% P( x. m
# s& c; q* ^1 ^$ _7 X6 u4 H
UF_CALL(UF_CURVE_create_arc(&arc_coord,&arc));
; y2 h! x6 [3 s+ v! x! E5 C! r- }    UF_MODL_create_list(&objects);+ u) W! m# M  r9 C4 O
    UF_CALL(UF_MODL_put_list_item(objects,arc));
" q* n' y. T- K! c  e9 s
' s: D1 \, m& E# a3 }# F UF_UI_specify_vector(message,&mode,UF_UI_DISP_NO_VECTOR,direction,origin,&response);/ n* E/ g, j: N& F4 K  J
if (response == UF_UI_OK )
7 \. @9 V0 b5 V% E {
) K- u$ E7 }  c1 R  UF_CALL(UF_MODL_create_extruded(objects,taper_angle,limit,point,direction,UF_NULLSIGN,&features));
- s2 D! @# D4 a$ m: [ }, X6 M: [8 t9 ]' I. F
else6 z1 @0 o& B: d  N" w
{
" N0 w9 F2 D* K2 |' B; e8 m  return;: Z" p7 R" u% \0 S4 n( h
}
; g- t+ X" c/ o0 \! Y goto l10;+ \: R* x+ y; \5 J! m9 D& V* p8 d
3 R; ~6 g( Q5 |0 u4 `
    /* Terminate the API environment */& h+ }% T; e" T
    UF_CALL(UF_terminate());+ h6 Z4 w. j- e8 {+ p8 P( m( }7 n4 j+ N
}$ s) n3 D% D. G1 s6 u% w$ v* S: Q0 x; Z
/*****************************************************************************
+ S5 w' p7 g4 W; b3 y**  Utilities
; b6 g  M/ i( |  r: |$ l*****************************************************************************/1 }7 p! t( ^& S- t- T
/* Unload Handler
9 k2 S1 H; ^  s8 `1 K9 f**     This function specifies when to unload your application from Unigraphics.
" q$ H/ e, E( L, ]' U- F**     If your application registers a callback (from a MenuScript item or a4 J# p  ]9 N2 @8 s! G
**     User Defined Object for example), this function MUST return
2 u' W5 [6 q( V: X* a! C9 W9 D**     "UF_UNLOAD_UG_TERMINATE". */7 R* ^' c7 m' V1 s/ H; \! b0 y
extern int ufusr_ask_unload( void )) L  Y, ^$ R0 F
{
# O, q7 v& Z* H8 {: Y* V    return( UF_UNLOAD_IMMEDIATELY );( d8 F+ z  A1 T2 Z" |1 s2 p
}: [9 t) A7 ~% ~) J6 Y" z; Z; W3 P

/ O+ V* X: T* B5 }" O  C! e0 ]6 p3 a
, i, X: _+ D( P

绝对坐标系下成功

 绝对坐标系下成功

转动坐标轴

转动坐标轴

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

点的位置在圈出的位置,圆位置不定。
上海点团信息科技有限公司,承接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
- c  }* _/ a& q. V. g% Y, y4 o
% V: i% T. e" k( C7 [你创建的点应该是 绝对坐标系下的,所以需要转换成工作坐标系的再看,另外,通过vector选取的矢量是不是也是绝对坐标系的 也要进行转换
% R+ {# A" C: N4 n  n8 P' a& F5 L1 j$ L8 U- M& I
这个你需要多试试,首先把你通过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);                              
+ X% e( e+ N$ J, NUF_CSYS_ask_csys_info(oldwcs,&matrix_id,csys_origin);   
9 }; j0 |6 M9 ^0 k7 OUF_CSYS_ask_matrix_values(matrix_id,matrix_values);    : u2 }# e1 ^* ?7 K
UF_MTX3_x_vec(matrix_values,x_vec);                  
) I) s9 h9 B( J$ `4 sUF_MTX3_y_vec(matrix_values,y_vec);' o  o+ @5 c- S% q. E2 U: X
UF_MTX3_z_vec(matrix_values,z_vec);' m: U/ ~4 m" D0 l+ b
UF_MTX3_initialize(x_vec,y_vec,mtx);               
* H, i6 f* z' N, CUF_CSYS_create_matrix(mtx,&mtxid);- X0 v, O) B9 @
UF_CSYS_create_csys(csys_origin,mtxid,&csys);    " V& _  [) |( t! g
UF_CSYS_set_wcs(csys);  ' r9 Z' D6 W2 ^
! {- j/ x% k/ b8 e  D: j: {

8 Y- O3 r$ S' o这段代码,没什么意义吧, 你可以看见你创建的csys 并没有跟wcs关联
. N* \" U; i; G$ t, p6 Z5 A' B5 W6 t: t, w; E
不需要这些代码
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了