PLM之家PLMHome-工业软件与AI结合践行者

[二次开发源码] NX二次开发源码分享:动态画圆,指定屏幕点和向量相关用法

  [复制链接]

2016-9-17 10:11:08 6597 2

admin 发表于 2015-2-9 13:45:19 |阅读模式

admin 楼主

2015-2-9 13:45:19

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

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

x
; I" \( ?8 R! z- E( F! M- V+ R
NX二次开发源码分享:动态画圆,指定屏幕点和向量相关用法
' X) \. i" k, M! M# Y' y5 }  z# ^: @- ]: f
6 E2 @9 P6 Z# ]0 @/ _4 h% p
这个案例很不错的,分享下,程序运行的结果是指定屏幕,拖拉即可动态绘制圆圈!0 j( Y+ q! Q+ R" H% V7 P
5 w) M7 W! u7 H
#include <stdio.h>+ Q# y( i6 `1 G8 m8 E# g
#include <uf_defs.h>) L6 K. A) J* z3 q. \% x0 ?: m
#include <uf.h>
2 t5 j' x  s0 k5 d& A8 _3 y0 c#include <uf_ui.h>
% l' l/ T; K, k4 U* H% h/ b  g#include <uf_csys.h>
. ^. R* K1 O* G. m& g& A2 P0 q2 D& W#include <uf_vec.h>
+ r$ h$ a# E0 d6 `& f3 p* D#include <uf_disp.h>
1 e  l7 X+ O, Z0 w* c$ Q1 P/ k" h#include <uf_curve.h>
4 s# ^% ~" E4 m9 i+ |( ^+ V! Q#include <uf_mtx.h>
7 V( B/ x7 c3 x6 o5 N3 F& ~#include <uf_obj.h>
1 K& I6 ]1 \$ t1 K: V0 m! ttypedef struct
3 L5 F  u$ g) O- M) v0 r8 T        { UF_CURVE_arc_t  *arc;
9 ^2 y# M2 s2 c% ~          double          abs_ctr[3];
7 I7 R; e' L* G0 [          double          matrix[9];
* T6 G, e+ ]0 ~          double          x_axis[3];. z$ R8 p( e& R' _. ]
          double          y_axis[3];& Z) I1 @5 n, J, o# `' E! U
        } my_motion_data_t;* ^# O, k5 P. A0 z4 F
/* Define a motion callback to render a visual representation of
) r5 t( E7 o/ o/ l * the circle to be created, along with a bounding box around the* w# G" g3 T+ n; u. z* l5 H
* circle, an arc of radius 1.0, and a "rubberband" line from the
* Y: L8 M6 X$ l/ W * center to the cursor position.
2 i: ?$ h- \2 z( Q */( c! b3 \% \( E5 I/ p
static void motion_cb( double                   *screen_pos,
6 @  m7 ], j7 s; d                       UF_UI_motion_cb_data_p_t  motion_cb_data,
% v; B- Y" q' ^9 `6 ?! e                       my_motion_data_t        *my_data )% ], P3 x+ I% o
{
3 b1 g( h, t3 r* H3 i( e    double radius, pos_array[5][3];2 T/ f$ D4 f0 x7 v
    double xrad[3], yrad[3], x_y_vec[3], x_ny_vec[3];
) c, e* C8 q8 d9 I    /* Calculate the arc radius:  the distance from the arc center$ ]& k* H/ N3 o4 U0 Q5 P3 [
     * to the current screen position.
" c) X% U, c- e0 `- f! B     */
& R! [1 z; L1 l' U0 I    UF_VEC3_distance( my_data->abs_ctr, screen_pos, &radius );" l& Y1 G) q* y" e4 w4 K
    /* Map the arc center to the "csys of the arc".
+ K: L' b  \/ e     */, \: ^# Q1 V* L! R
    UF_MTX3_vec_multiply( my_data->abs_ctr,7 y+ k, o8 t1 u2 R' l$ E) L& m9 c
                       my_data->matrix,* I' L9 z* f& \
                       my_data->arc->arc_center );* B; n, T9 v# i/ y) F& ^$ r8 Q
    /* Draw a circle and an arc in the view of the cursor.( y2 |3 j* Y' y1 ]0 H2 |; K
     */( d# u" C: a( ?3 B) h+ h9 q5 u* R
    UF_DISP_display_ogp_circle( motion_cb_data->view_tag,. m$ S( o& z& V. k2 r8 j7 ^
                            my_data->matrix,( `8 ?7 W: @, P6 P* U! q
                            my_data->arc->arc_center,; \# I# D! K% a
                            radius );$ {& Y2 V0 V& B3 S, _6 s
    UF_DISP_display_ogp_arc(    motion_cb_data->view_tag,
8 W# {8 \3 t) T7 ^# n* o* {  Y                             my_data->matrix,# |& u7 v2 k9 w3 ~- I( t
                             15.0*DEGRA, 345.0*DEGRA,* b+ ?; G  D* N  _7 ]4 b
                             my_data->arc->arc_center,- G( t+ W2 T: j) Y& W
                             1.0 );7 h* _8 G* ]2 q) Q, X1 N7 D
    /* Draw a bounding box around the circle.6 B# O& _8 q  S, W0 ^2 x
     */" c% B- l* ^0 `
    UF_VEC3_scale( radius, my_data->x_axis, xrad );
# K! S; d% D+ c$ N# z' q    UF_VEC3_scale( radius, my_data->y_axis, yrad );
2 a0 p- {; d. {4 d2 A    UF_VEC3_add( xrad, yrad, x_y_vec  );
7 i" c' V* J, s3 I0 {, |    UF_VEC3_sub( xrad, yrad, x_ny_vec );* V3 b. Z' k5 w9 g8 M5 k
    UF_VEC3_add( my_data->abs_ctr, x_y_vec,  pos_array[0] );- o5 K; O7 q2 L" P5 M7 _* p
    UF_VEC3_sub( my_data->abs_ctr, x_ny_vec, pos_array[1] );
- p/ l. C  m8 O) U: s4 d    UF_VEC3_sub( my_data->abs_ctr, x_y_vec,  pos_array[2] );; t8 M* T/ F2 x- f: y
    UF_VEC3_add( my_data->abs_ctr, x_ny_vec, pos_array[3] );
4 y: |3 |6 R2 i, d2 U, j/ S    UF_VEC3_add( my_data->abs_ctr, x_y_vec,  pos_array[4] );
" Y: }  K0 r& v' b    UF_DISP_display_ogp_polyline( motion_cb_data->view_tag,9 s% z* k7 S3 H0 ~: e
                              pos_array, 5 );
* }6 q1 b6 _8 F7 x    /* Draw a "rubberband" line from the circle center to the+ H5 R8 J, S$ A1 T1 J1 u$ |! o
     * cursor position.+ J+ A2 y+ Q; G4 E6 j6 L& Z
     */
4 S- b% i: Z+ x1 A. h! d- }    UF_DISP_display_ogp_line( motion_cb_data->view_tag,- i8 [( Y0 b, V- l
                          my_data->abs_ctr,' F  s6 B' {' V* H0 c
                          screen_pos );
2 U3 s* A# u- G9 }/ [- b}- v; W) i) t2 s4 J
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))6 o* W: q) n1 K) z( {; N
static int report( char *file, int line, char *call, int irc)0 H% ~9 A9 W+ x9 Z" D" m
{
  K4 S& K5 N8 `9 H3 X  if (irc)
$ M# |6 t7 h  t  {4 Q- C( ]2 \, ~. O
     char    messg[133];
7 |% D3 [& m. j7 N2 s3 V5 K     printf("%s, line %d:  %s\n", file, line, call);
5 O7 P7 W" D( s1 ^     (UF_get_fail_message(irc, messg)) ?
. A$ g3 l3 s9 d% y# E       printf("    returned a %d\n", irc) :1 ~* E0 Q& l, |4 @3 w) L! c7 K
       printf("    returned error %d:  %s\n", irc, messg);& m+ ?( r7 M; |
  }  R' x/ y; Z7 A! v9 y
  return(irc);5 N7 |! C2 H9 V0 o1 r8 w7 X
}9 I2 W9 k5 b' t, U
static void do_UGopen_api(void)
3 U7 N- l% R5 o' ?5 N( K9 l{
( D$ }2 }# C/ p* l$ _3 e    int               default_plane;- s, B/ E- r8 X' M) T
    int               plane_resp, ctr_resp, pos_resp;$ |% ]" C/ ~5 P
    tag_t             plane_tag, saved_wcs, mtx_id, csys_id,
6 G6 \3 \6 u. J) S& ^! N% `" j                      arc_id, view_tag;3 _0 b6 P# b% Y, o7 |* j  {# F' s: |
    double            plane_matrix[9], plane_origin[3],; K2 W; r5 |/ ^
                      x_vec[3], y_vec[3], arc_edge_pos[3];
" \1 M& E% ]" ~4 T: G) G( X9 x    double           root_origin[3] = {0.0, 0.0, 0.0};
; l5 u7 Z9 _8 f2 D4 c    double           work_origin[3];7 `3 o' o, q8 S' P
    UF_CURVE_arc_t    arc;
' a. A/ y$ w4 v  l    my_motion_data_t  my_data;
6 P1 h% n4 F3 q) S3 D0 {
9 i& u3 {, E, U6 q& f0 G' Y    my_data.arc    = &arc;
, g, W0 q8 e# h$ V$ X, ^    arc.start_angle =   0.0;$ Z! Z& \: F" g/ ^
    arc.end_angle   = TWOPI;    /* Create a full circle. */
8 \. ~7 P, v0 E4 W, z* u# S6 T    default_plane   = 5;       /* Default plane = WCS */
1 y) |% ^- j; c' V2 q$ U) Q! `  V    do
5 T! g9 z1 k# v0 _5 n    {' v. z% N$ k+ i: _4 J' C9 {6 q
        /* Specify the plane on which the circle is to be created.
* _& ?* g# g) y( g         */
# G. s9 S% m: S  P* v        UF_CALL(UF_UI_specify_plane(( o: H+ e& f6 Y
                         "Specify plane for circle creation",
6 n* @; O/ M- U% l: P; a. P                         &default_plane,* h0 b: X( v5 u! _  e' e+ K; E5 X2 y
                         1,( r, ^- r% h! H- V
                         &plane_resp,
" @9 o/ J! t# Z) T/ T4 S                         plane_matrix,
7 I  t% j3 T! b! W8 L# F7 z) l                         plane_origin,
& ]7 m8 r- ?* T, G2 G  R( ]" Z                         &plane_tag ));
; O0 v) p2 C- j        if (plane_resp ==3)6 s! e5 v0 o/ ^( y' ^. ]( n0 n1 W
        {
/ @' B3 h* L$ T            /* Save the current WCS for future restoration.0 Q. d" C0 J0 s4 q& H
             */( c( s" x: Q0 b( D! ^
            UF_CSYS_ask_wcs( &saved_wcs );0 \  [+ d6 U& j' M" r' `9 D* G
            /* Move the WCS to the specified plane. This is
) r# b# q" F/ e1 E4 ?             * necessary because the position passed to the motion2 [+ l' t  e+ }8 i# @
             * callback, and the position returned by6 [! s7 J0 t1 c
             * UF_UI_specify_screen_position, is the screen
: k( T8 j+ c$ D! G" Y0 `             * position projected onto the WCS XY plane.
0 [1 a) Q0 b/ x: {2 ^             */; K( {6 o0 R% b7 \! I+ R
            if (default_plane != 5)
( @5 V3 p3 I& R% {) v8 H            {! E" U2 p. a6 G3 y
                UF_CSYS_create_matrix( plane_matrix, &mtx_id );/ D$ D7 p, |  @
                UF_CSYS_create_csys(  plane_origin, mtx_id,/ l! A$ k2 O+ B8 @1 b0 L
                                   &csys_id );
/ l& V/ {/ A! l                UF_CSYS_set_wcs( csys_id );  p( G" d  D8 \# [
            }
4 q! W6 X: L; c4 b+ P  y  ^. @9 R            /* Obtain unit vectors and the arc matrix relative to: e; @  f. u. K
             * the Work Part coordinate system.5 @5 E3 ^+ `* h9 p  P( Z& |' j
             */- i) A( T9 z: i
            UF_MTX3_x_vec( plane_matrix, x_vec );
( [2 q8 j: T/ W9 ?4 Z            UF_MTX3_y_vec( plane_matrix, y_vec );# m1 b; o# f9 k
            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, x_vec,
: e& @7 m7 V' p% a9 b2 S5 f0 j                            UF_CSYS_WORK_COORDS, x_vec );
2 D7 f/ V: l* L$ N+ r, z; F" s; I            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, y_vec,
$ L3 g7 H+ F  d# n6 i                            UF_CSYS_WORK_COORDS, y_vec );# {) o' ^3 f" m% @
            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, root_origin," |5 ?+ D4 J0 M! _+ s4 F4 C
                            UF_CSYS_WORK_COORDS, work_origin );
, U- ?) [& o5 C. U0 A$ [            UF_VEC3_sub( x_vec, work_origin, my_data.x_axis );1 v  u) P% V. f% u% A
            UF_VEC3_sub( y_vec, work_origin, my_data.y_axis );: [# l' _  q3 m4 t/ }( I4 ]
            UF_MTX3_initialize( my_data.x_axis, my_data.y_axis,
' [: V  Z3 i! c                             my_data.matrix );# ?/ d7 G$ x- p- S4 N( y
            UF_CSYS_create_matrix( my_data.matrix,
4 C% O1 ?2 n! \9 c                                &arc.matrix_tag );( K, k! c! _2 z: h' e
            do
3 O: D! r. m: g4 H            {, p0 U" s; W" K3 {
                UF_CALL(UF_UI_specify_screen_position($ x0 Q% Q! }3 v4 ^" o" I
                                "Specify arc center",
3 p( m  G) M$ k2 |                                NULL,
( P# V# |8 ~3 D7 M3 W% `3 E8 w6 [! O                                NULL,
9 v" V% X$ s; `% |0 x& J9 m0 M8 ]. [                                my_data.abs_ctr,
6 ?2 L  g4 M2 ?% j8 s                                &view_tag,
4 g+ W( U3 W  }2 ?+ U                                &ctr_resp ));
! A* K+ a! @% g  c) F3 V5 w                if (ctr_resp == UF_UI_PICK_RESPONSE). T0 E1 I( H$ b( f% ?3 |
                {
& |/ c( S8 |* X/ y7 z                    /* Map the arc center to the arc csys.
, _3 y5 Z% H0 E+ H5 U+ ~& b                     */  W( p; F0 u" a. I6 f' o! f* [
                    UF_MTX3_vec_multiply( my_data.abs_ctr,
6 T, r7 S) A& P& Y4 w- _                                          my_data.matrix,
" D% S" @: E! b7 Y; i- _3 F" Y                                          arc.arc_center );2 N% s* k7 R; Q* |& `& a
                    UF_CALL(UF_UI_specify_screen_position(9 u! @+ p8 h& i8 R+ I! r8 V: w
                                    "Indicate arc radius",& c. i3 D. V9 a6 h$ ^. z3 F, _
                                    (UF_UI_motion_fn_t)motion_cb,
/ i  n- n& f5 r3 R, ]$ ~/ {3 R. D                                    (void *)&my_data,
( b; o% L) ], S8 v2 _6 O6 H                                    arc_edge_pos,
2 {- t8 n3 T! |3 r                                    &view_tag,
: @% @! c% p1 W                                    &pos_resp ));# t+ Z: n  K  |. P
                    /* If a position was obtained, create the1 S  ]9 R/ c( J, p6 p
                     * circle.
0 n4 H3 r% ?: y9 i9 R1 j0 X# m                     */: L6 y0 u& n1 U6 E! U0 s( j7 P! i
                    if (pos_resp == UF_UI_PICK_RESPONSE)5 I4 ^$ V0 z; n) O2 U+ v- T
                    {
) ]5 ~, L0 h& o0 b& ^                        UF_VEC3_distance( my_data.abs_ctr,
8 q% Z3 O. p: }" Z- p$ W                                        arc_edge_pos,
6 Q% W2 \5 y' N# @% g                                        &arc.radius );
' h. s% O% N6 L9 H                        UF_CURVE_create_arc( &arc, &arc_id );
! V! ?( u8 q+ }. @+ t3 ~                    }
" ]( T. I8 s1 [                }+ |$ q- N4 W3 N  U
            } while ( (ctr_resp == UF_UI_PICK_RESPONSE) &&
) y& A) Y9 `5 o) E; |0 E( g* e+ Q, T                     (pos_resp != UF_UI_CANCEL)           );
, W0 |9 t0 F, t. f            /* Restore the WCS if it was altered above.% ~: W+ g+ p8 j7 f+ N3 W1 i
             */- m% f2 K* S0 i7 i  ?, r9 Y4 h$ h  ]5 r
            if (default_plane != 5)
- \% F' h# B( a            {
7 N- _: E9 }# s$ O2 {                UF_CSYS_set_wcs( saved_wcs );0 f  Y+ P0 N$ g: U9 H8 M  v' }
                UF_OBJ_delete_object( csys_id );
& |; r4 G# _& H            }3 P* }4 G' j0 Z- M! F/ Z
        }
% y/ t; D9 o' C7 M8 J4 @    } while (ctr_resp == UF_UI_BACK && plane_resp == 3);
- D9 f8 K6 i- v8 ]. @}
# x# V# r2 E% t0 p/ w/*ARGSUSED*/
) K$ U& e' L  u  K, v( ]2 {void ufusr(char *param, int *reTCode, int param_len)
# u* K( X+ Y$ e{
7 z# Z5 m! h  }. U  if (!UF_CALL(UF_initialize()))
7 a5 f) U) a- Y- D! e  {, a$ L& _$ }; N5 R& ]
    do_ugopen_api();. m$ {5 y# O# M# D4 E# V1 H
    UF_CALL(UF_terminate());
1 L  B" W: c8 i1 a4 ~1 T. N' f  }- P5 W0 S$ _5 P- f) c
}
  v1 x# g4 o& M0 Z" T( aint ufusr_ask_unload(void)
8 f3 c5 E% V; K2 S9 e{' H7 O0 M- B$ E; q+ n
  return (UF_UNLOAD_IMMEDIATELY);
9 g4 A5 l* ?0 K' K9 ]}* X2 j  M! U3 Y( z1 V
# g5 u# Z& I$ u
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

全部回复2

yuleihz 发表于 2016-1-8 22:21:57

yuleihz 沙发

2016-1-8 22:21:57

老师来个NXOPEN的耍耍
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复 支持 反对

使用道具 举报

wu150060 发表于 2016-9-17 10:11:08

wu150060 板凳

2016-9-17 10:11:08

学习一下,顶( }
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了