PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

  [复制链接]

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

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

admin 楼主

2015-2-9 13:45:19

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

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

x
" B, F8 L/ J" M" a0 k4 F" n. i; [
NX二次开发源码分享:动态画圆,指定屏幕点和向量相关用法8 F' A; O, H9 U9 l

8 ?' I4 e4 ?4 w2 s/ ]  j. @2 j
6 u/ O  k+ u0 T: |- [% z
这个案例很不错的,分享下,程序运行的结果是指定屏幕,拖拉即可动态绘制圆圈!: L' [) q8 p6 R% e- u

) E+ b: \2 R8 H: ~4 T#include <stdio.h>: J. l/ {  U$ Q
#include <uf_defs.h>+ x: f  d$ R5 r: o: X: _
#include <uf.h>
* ^, k2 {% m3 j* V#include <uf_ui.h>, i7 x/ f$ z* ~! I
#include <uf_csys.h>
& ]9 @9 V: b0 H2 \: `#include <uf_vec.h>5 l. J3 m7 g! M/ [- K& l9 i+ h
#include <uf_disp.h>
3 J( X( T2 T/ Z% W/ O#include <uf_curve.h>3 U% a* @2 |, D+ X+ c3 c, a
#include <uf_mtx.h>5 R$ K: k2 ~% h. E5 X
#include <uf_obj.h>
: E- T  n- S1 K) a! ^typedef struct
' @+ z3 _6 c, g: T- k; H( I        { UF_CURVE_arc_t  *arc;
+ n8 [, [3 a& H          double          abs_ctr[3];+ L4 a. y; Z- r
          double          matrix[9];, ^# p& a5 |6 N) L
          double          x_axis[3];$ s" Z8 q- G' e9 }" o
          double          y_axis[3];
2 m1 d" z6 ~* ?+ S3 Z6 q        } my_motion_data_t;
- G- p$ j7 b5 n8 v/* Define a motion callback to render a visual representation of/ @! ?( N5 @' X8 }0 k+ s/ X- G& u8 d
* the circle to be created, along with a bounding box around the
3 X% L( O$ ^4 n4 z * circle, an arc of radius 1.0, and a "rubberband" line from the* q! n2 U3 b  u+ M$ Y
* center to the cursor position.7 F7 ^" M$ O. f
*/
7 O* [" B! @' k5 f" R# b* Q* Nstatic void motion_cb( double                   *screen_pos,
( x4 P$ a4 ~/ t0 A* H                       UF_UI_motion_cb_data_p_t  motion_cb_data,
  i* U& D$ ~9 {2 L: P8 ~) x                       my_motion_data_t        *my_data )* G- Y: p2 ^& b* L+ m
{5 k) z  j4 h& u1 S% ~& u
    double radius, pos_array[5][3];1 u4 b' C' \4 F' y% u! F$ c. f
    double xrad[3], yrad[3], x_y_vec[3], x_ny_vec[3];
+ r4 P( J, x3 @0 ?$ K    /* Calculate the arc radius:  the distance from the arc center1 R5 T, L9 `* C( Q" M) F0 P; E
     * to the current screen position.1 K9 Z1 l( E& A4 [
     */. X' p! Z8 _. i* `' \( ^6 [7 N
    UF_VEC3_distance( my_data->abs_ctr, screen_pos, &radius );" l1 H, @3 E9 W! I- h, Q( d
    /* Map the arc center to the "csys of the arc".
( q8 U& z6 |1 L" A6 U- x) s     */( O, |: \. w! ^, B
    UF_MTX3_vec_multiply( my_data->abs_ctr,8 {0 v( x3 A- u3 Z! _4 i
                       my_data->matrix,, N! b) b2 a6 J& [* _
                       my_data->arc->arc_center );
0 C  b1 F; h. o    /* Draw a circle and an arc in the view of the cursor.& w2 l* M+ `1 C- A$ i- w
     */1 B, z- q1 S* c+ E1 X# P. O. m
    UF_DISP_display_ogp_circle( motion_cb_data->view_tag,  N8 x& \3 c( c* e0 j% ~% Z0 X
                            my_data->matrix,: b; X' R# `+ |+ S# a; t( z
                            my_data->arc->arc_center,
: D/ `. ]- V+ C* }0 B4 C                            radius );& c2 V$ M+ m( v0 j3 J% ~- v; H
    UF_DISP_display_ogp_arc(    motion_cb_data->view_tag,
" ~# V4 \9 k/ Z$ W                             my_data->matrix,
. D! ^* z9 d, \' M5 z5 h                             15.0*DEGRA, 345.0*DEGRA,/ x% D- T8 R% ~1 d" t
                             my_data->arc->arc_center,
! E! R2 D5 [* i0 p, n                             1.0 );
5 Q  L' a+ u# K; z+ @0 i    /* Draw a bounding box around the circle.6 O/ K9 j* j$ @: t) W
     */( k  n4 i( f1 g, n3 R4 ]+ p
    UF_VEC3_scale( radius, my_data->x_axis, xrad );* A1 |: F- q- `' \$ i. Y
    UF_VEC3_scale( radius, my_data->y_axis, yrad );
5 T: k7 w$ K7 D8 B! F' K+ c    UF_VEC3_add( xrad, yrad, x_y_vec  );, f% y  t6 U$ [$ \% E! s$ ^# y6 l
    UF_VEC3_sub( xrad, yrad, x_ny_vec );
2 r" e, I4 G! X; C  x" G    UF_VEC3_add( my_data->abs_ctr, x_y_vec,  pos_array[0] );
) x; Q) |7 ^5 k5 z, ]; P    UF_VEC3_sub( my_data->abs_ctr, x_ny_vec, pos_array[1] );
3 O1 h3 I6 ?) b    UF_VEC3_sub( my_data->abs_ctr, x_y_vec,  pos_array[2] );
# k1 z: y2 U/ k  B/ ~    UF_VEC3_add( my_data->abs_ctr, x_ny_vec, pos_array[3] );
! g, @7 r& [" m4 Z    UF_VEC3_add( my_data->abs_ctr, x_y_vec,  pos_array[4] );+ i4 D! \6 ^* ?0 J
    UF_DISP_display_ogp_polyline( motion_cb_data->view_tag,
8 E0 O) v% q! M( A8 z0 i3 f                              pos_array, 5 );$ F# u- X: g3 T' v8 n' ~
    /* Draw a "rubberband" line from the circle center to the
$ C. ]2 y( @( K- m" ^1 |. G& D     * cursor position.+ Q" C/ T* W' [$ b: R9 B# ]8 \
     */# }5 I7 b/ j  }( ?, b* E9 T5 B
    UF_DISP_display_ogp_line( motion_cb_data->view_tag,# t& T2 d2 s( C! |
                          my_data->abs_ctr,
7 T$ Y' ]! Z+ G2 ?                          screen_pos );
6 h- Y: C8 D' ]* m, v}; J  ?$ C. c# K3 J$ u
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))& C, k# c, h  J# r6 d/ n7 @, T( ?
static int report( char *file, int line, char *call, int irc)" ]4 `" O3 Q* q: i/ k
{
- y1 c- C: I* H' k$ w/ I  if (irc)/ G6 _5 x8 x9 p4 m5 E+ r) U, E" T
  {& f0 N0 P+ x0 K0 b! y
     char    messg[133];9 |9 K6 r7 `5 h( {/ n2 l& S
     printf("%s, line %d:  %s\n", file, line, call);* u9 _; q  k* P3 ?
     (UF_get_fail_message(irc, messg)) ?
: z" b. i' o+ f# a       printf("    returned a %d\n", irc) :4 P3 {. `* x/ X  Y( O
       printf("    returned error %d:  %s\n", irc, messg);8 i6 S0 j1 Q5 E1 r2 C. m$ g5 |3 \, m4 t
  }
6 o% M( c" u: V  return(irc);. i) z6 D8 b) L! t
}
5 p, O3 r9 E  t2 z- I2 Lstatic void do_UGopen_api(void)6 z; i3 p5 o- }) U
{1 y% w" B* s. y4 Q% [) p4 E
    int               default_plane;! C& q% S- k& q
    int               plane_resp, ctr_resp, pos_resp;0 U: ]% W' f: \
    tag_t             plane_tag, saved_wcs, mtx_id, csys_id,' C& @& G' E, {* b# y
                      arc_id, view_tag;: p, X) I7 u3 Q  O
    double            plane_matrix[9], plane_origin[3],; E/ w3 M* N6 j  y; v1 q% {* z
                      x_vec[3], y_vec[3], arc_edge_pos[3];
; E0 S, P) h8 B/ E0 T    double           root_origin[3] = {0.0, 0.0, 0.0};
7 \7 u2 D3 Y: f# l  Z    double           work_origin[3];
* E2 V% }9 r0 t+ E, V    UF_CURVE_arc_t    arc;$ f) w9 N! ?. b* V1 ^
    my_motion_data_t  my_data;
* w8 h2 T' K: ^5 A7 A: K
. O0 p" K% h: \9 H- W8 B    my_data.arc    = &arc;) ]' [/ t* y, x! B) C+ O) ]
    arc.start_angle =   0.0;
% P: B5 V  H: z$ Y    arc.end_angle   = TWOPI;    /* Create a full circle. */
* s0 F6 N$ E5 x    default_plane   = 5;       /* Default plane = WCS */% z' g8 F) k% C2 h% r4 W* X5 r
    do5 Y- x8 q# k( t
    {
$ U: ~3 B0 w! Z3 J+ R        /* Specify the plane on which the circle is to be created.
) ^5 L" W$ W, `. y         */
' `6 H% j0 N) n6 E9 {        UF_CALL(UF_UI_specify_plane(+ K* M* ?# H) ]" V: Z
                         "Specify plane for circle creation",
; `' u2 k8 A1 S3 Z6 q$ \                         &default_plane,
; J8 ]# Y% z$ R* k4 }1 K( }$ \                         1,
7 H& @$ R. b! |: M) P4 k3 t                         &plane_resp," ^3 i7 D" n+ e4 @" t3 {: h4 A3 D
                         plane_matrix,/ w0 Y7 g/ `7 O3 w' @  u( W' ~: D
                         plane_origin,
6 k/ f: `( ^! t9 `. J                         &plane_tag ));
' A; a' m/ t* ]8 _- q        if (plane_resp ==3)& ^) ^7 k& n& Y9 W7 P; @' _; [8 }  g
        {/ A" {! h9 I6 y' U& u( f
            /* Save the current WCS for future restoration.: I% r8 c( I1 {- k6 F9 U2 h) D" W
             */6 w6 Q1 J7 ~, @
            UF_CSYS_ask_wcs( &saved_wcs );" @; V. v- d( f. z: G
            /* Move the WCS to the specified plane. This is
1 P, z8 j& i- @6 e; N- ?8 K             * necessary because the position passed to the motion  p& `0 n$ b9 k- d* n
             * callback, and the position returned by2 ^9 a0 q, A) ]! n; h! _
             * UF_UI_specify_screen_position, is the screen( U" Z6 ?0 ~3 ?, G
             * position projected onto the WCS XY plane.
) C' v. Q9 J% u  m' ?2 F             */
4 s: F# d# K2 W3 {8 D$ y            if (default_plane != 5)
$ b. H0 Q: l) q. K, S0 X* F            {, n1 \1 L' m* E0 B
                UF_CSYS_create_matrix( plane_matrix, &mtx_id );) B  K5 C$ ]. U! q
                UF_CSYS_create_csys(  plane_origin, mtx_id,
. V( g; D$ W: Y" n                                   &csys_id );
; G. }+ t" M2 c3 _                UF_CSYS_set_wcs( csys_id );  Q+ v6 m0 S% Q0 G" `& T, T
            }
2 [! |" q9 H1 p- s8 ?' [            /* Obtain unit vectors and the arc matrix relative to
8 ?& f$ }+ x8 V3 j  F( `- D3 `             * the Work Part coordinate system.
5 b4 c' V6 ?2 x3 ^             */
0 c* c$ X3 G* K. |( y$ U            UF_MTX3_x_vec( plane_matrix, x_vec );9 c! N$ x* `( {. N
            UF_MTX3_y_vec( plane_matrix, y_vec );$ S, m0 j. ~- P: t# t6 ]' E
            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, x_vec,
! y; {; x3 c9 U) J1 |, J                            UF_CSYS_WORK_COORDS, x_vec );
' t' Z% C. p/ {& O            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, y_vec,
0 i8 _& q/ o) g9 \& R: y% \                            UF_CSYS_WORK_COORDS, y_vec );1 ^+ a9 U0 b/ V  W( @' D
            UF_CSYS_map_point( UF_CSYS_ROOT_COORDS, root_origin,
0 h4 ?6 V( d' l; m% e                            UF_CSYS_WORK_COORDS, work_origin );3 w, z. N- R; g( r( f  K+ ?  e7 q/ L
            UF_VEC3_sub( x_vec, work_origin, my_data.x_axis );: P4 `1 C! p2 i
            UF_VEC3_sub( y_vec, work_origin, my_data.y_axis );; |3 _# p8 V# C# _1 m
            UF_MTX3_initialize( my_data.x_axis, my_data.y_axis,
% w" M" W' P0 q& }+ {7 i0 Z                             my_data.matrix );
' H, |6 G; i. ]  f+ Q" [            UF_CSYS_create_matrix( my_data.matrix,
, T! b: p- O# F2 Z                                &arc.matrix_tag );
3 W% D  f! j, ^6 V) c            do
) s6 ^7 K) o/ E4 @/ e            {
; `, Y! q0 J2 L. m% k                UF_CALL(UF_UI_specify_screen_position(
( _/ {/ O. v/ ^& O% w) E                                "Specify arc center",
8 D& y$ u; p5 Z( t3 Z: L3 j$ }                                NULL,
9 e$ i3 @3 W1 Z1 y                                NULL,
- s) b' G6 _% G; B$ a                                my_data.abs_ctr,
% J# U" q2 R) `' v" ~8 e8 J                                &view_tag,( a3 O. L$ T: b; E7 o9 D
                                &ctr_resp ));
0 G; }" T+ R: j8 p1 ^' Y  O& o0 R                if (ctr_resp == UF_UI_PICK_RESPONSE)
/ N4 H* z# w* E( L0 W1 k                {
$ R+ A% R' W: c4 W7 b$ U' Q/ y; d                    /* Map the arc center to the arc csys.
5 G' m, K& v( `0 S- z3 h9 f! s                     */
: E: v7 u8 L) p' b                    UF_MTX3_vec_multiply( my_data.abs_ctr,
3 H: L2 K5 Y4 }3 n- [                                          my_data.matrix,7 L+ Z$ f+ e* m; q
                                          arc.arc_center );
8 z; \( y' Y8 Q- B& r                    UF_CALL(UF_UI_specify_screen_position(
# O+ ?* a/ W3 B$ Z- N                                    "Indicate arc radius",
! P/ p6 i2 I: c, ~) \                                    (UF_UI_motion_fn_t)motion_cb,
( f, E' _. E8 d0 j! e8 ^1 ^                                    (void *)&my_data,
0 I8 a1 @  \" |+ J: Q( i                                    arc_edge_pos," A' z5 }: o! N  E# _
                                    &view_tag,
1 R. s+ @7 D6 i, T1 }/ X                                    &pos_resp ));
, o  d7 e7 l# {# o# b0 O                    /* If a position was obtained, create the- r, y4 \% B7 Q  O1 E! C$ Y! n
                     * circle., t: ?5 X; ]/ X& X* K8 s, O
                     */
' r; o5 v: i5 b                    if (pos_resp == UF_UI_PICK_RESPONSE)
( W  {, p: g- h* E7 t8 H                    {, i; W1 X2 v/ a+ I9 H8 b
                        UF_VEC3_distance( my_data.abs_ctr,
- ?+ p* U  c! i% e3 C4 R                                        arc_edge_pos,
! }! A& x8 E, ?* h& x* m7 J                                        &arc.radius );
% A& ~$ w- D6 [# p$ B" i                        UF_CURVE_create_arc( &arc, &arc_id );8 t& w! v# J" _* v2 V/ s4 J
                    }! l% j. b" x( _% y/ h/ |" ~7 o
                }
. b  L/ W+ J& C8 z            } while ( (ctr_resp == UF_UI_PICK_RESPONSE) &&- D# h6 p% O. u0 S. }
                     (pos_resp != UF_UI_CANCEL)           );
4 C# z! X! W( y, _) G            /* Restore the WCS if it was altered above.
  T: \% i3 s/ m$ C7 m             */
4 x& A; a% i. f: S5 J            if (default_plane != 5)
5 b; Z9 U  |. @            {
0 D: F2 J" l( D6 c; I# ^                UF_CSYS_set_wcs( saved_wcs );# l8 u* F) [" U, D9 N" ^
                UF_OBJ_delete_object( csys_id );
2 u9 e$ X1 M! `- ?& g0 d' r& r            }' W& q2 K' z+ H* }% N2 R- D8 A# [
        }
" ?: B& i' b0 e: D9 g    } while (ctr_resp == UF_UI_BACK && plane_resp == 3);5 @) [: ~. c# V7 H7 f6 U' b, Z
}4 H( w$ Y5 j. M  s& Z" r
/*ARGSUSED*/  N1 G0 E4 {0 a
void ufusr(char *param, int *reTCode, int param_len); x9 T: z6 ?9 ^7 o/ T6 V
{$ p- ]7 f- B5 C! x" j
  if (!UF_CALL(UF_initialize()))
" s1 R# l( Y5 c* c' {, k; `/ m  {
" v  b& m: b9 E/ `    do_ugopen_api();
" o. k( L/ @( F, t2 B2 W! I6 K    UF_CALL(UF_terminate());. V# w  E9 b0 \' U0 n* P3 w
  }
# ~; S( c* _; ?1 H}
/ \4 Y5 q" V9 c) W4 W; }int ufusr_ask_unload(void); D& U* i8 O. J3 `' a
{
, J7 H  ]2 [3 ~: H/ Q4 o2 ^  return (UF_UNLOAD_IMMEDIATELY);9 c9 B( Q3 F" z( g
}
9 Q: }; W; f2 U1 x5 K: ^1 C
: V' N4 o+ u1 l3 ?- q
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ 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二次开发专题模块培训报名开始啦

    我知道了