|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
4 a, c" r3 B z- U, N4 f
& D4 Y; t$ P; A' f
NX二次开发源码分享:NXOpen C++创建UDO的过程
9 C1 j5 O2 m2 n+ T3 y* t' }1 S6 _& V: o# b4 r. D6 m
5 t D+ s3 P8 A7 ]6 s
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
) S: D. F0 R, F3 Q6 R1 W- e. x- c" Y/ C
9 P: S7 x2 F* E" l+ D2 N( s: m# |$ _
4 p' V' p. Z* U
#include <stdio.h>' d4 b; v8 c6 H) o8 i
#include <string.h>
* v# y G3 v2 k6 k k! E& L#include <stdarg.h>' c( A5 ?! a8 ^% q7 q% E/ o+ B
#include <uf.h>; Z0 X1 K9 l/ |& G# M
#include <uf_ui.h>0 c$ p, f+ p# Y6 l0 J. W
#include <uf_exit.h>
4 z/ o+ e/ {! Q5 ~* q) w0 ]" o' H#include <uf_disp.h>
0 B0 X. b2 k( G4 P% q9 d# _: s: \: s* M/ t; Q+ E
static void ECHO(char *format, ...)2 T* p _, X% T5 z% d
{
& t8 G/ q- k1 A) E+ h, Y char msg[UF_UI_MAX_STRING_LEN+1];
% Z* Y8 \+ K# M va_list args;! F9 n# @3 R; a
va_start(args, format);
5 }4 d( i+ o% k5 Z vsprintf(msg, format, args);
& g2 W9 m' [' C0 x6 W va_end(args);
* }3 f2 d* l4 C. x5 |: }4 C UF_UI_open_listing_window();3 z3 F* I* i! @2 ?! R2 W0 X
UF_UI_write_listing_window(msg);' d; b% b p2 `/ g# p' @3 U5 i
UF_print_syslog(msg, FALSE);
3 Y) z+ A8 Z& S. a6 o4 S}$ F! a! w0 h- l+ g4 s1 G4 {
7 j# A+ R) ~- f# {4 \9 Y ]/ K
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))# p3 v8 d6 X! |& g, |# }0 u9 J
+ a( U- c) {3 y4 v6 lstatic int report_error( char *file, int line, char *call, int irc)+ f Z4 }* ^ B7 X7 F! D, |1 E
{
0 S% o7 _1 B& q4 {0 L1 y" e if (irc)
( n$ i9 [# ], C" \) s+ ] {! C' Y0 @- W) k" [, P
char err[133];
2 \2 v. E% v+ s: X4 O. \6 I0 S" n2 f) a
UF_get_fail_message(irc, err);& ~2 G; b: j. q
ECHO("*** ERROR code %d at line %d in %s:\n",
1 Y0 D! c8 W; @# a8 ] irc, line, file);( d3 u: i$ x* m) o4 \3 T
ECHO("+++ %s\n", err);
9 t1 [( V D7 c! S2 m+ j ECHO("%s;\n", call);
3 w) [, c I+ a3 G9 f7 l- j& C }1 _) ?+ C$ L6 U1 N" k+ U
4 j6 B, l1 E9 \( X! J4 @
return(irc);0 ?- R6 z2 m8 E: g7 }1 U
}4 Z9 n' }2 P8 `6 `: Y
1 e2 u6 V; e% J6 M1 k2 {
#include <NXOpen/Session.hxx>
8 z2 \' G( t F! S7 j/ X9 ^#include <NXOpen/Part.hxx>
0 b% V+ x/ D) k6 `#include <NXOpen/ParTCollection.hxx>
B$ d K% m4 h v0 x6 ?, |#include <NXOpen/Callback.hxx>! Q! G e1 p! _ p! h+ E8 a+ }
#include <NXOpen/NXException.hxx>; L1 ~# a. x9 G) G
#include <NXOpen/UI.hxx>, Y) N1 H. A5 ?" j' ]" t) S
#include <NXOpen/Selection.hxx>$ Z8 P# y( C( g+ H+ ?
#include <NXOpen/LogFile.hxx>
& ~: z2 J% S- [2 y$ L# O' R6 f#include <NXOpen/NXObjectManager.hxx>
; H) y5 Y: n( g* A7 o' L( U% _9 S: ?#include <NXOpen/ListingWindow.hxx>
! n) N' w4 Q X#include <NXOpen/View.hxx>% q, F1 Y+ j$ \" S
3 B2 \9 K5 l$ h+ D- |# w- u0 H* C" @
#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>
/ }6 a2 @: S2 n1 h#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>& O' b8 o3 w- g6 V
#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>/ A6 {6 @" h* X! ?4 e
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>
: e' E5 e7 t# k( l( _; d#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>" [, |+ H W+ w4 e1 f% O
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>
: e x3 o' e# r$ d+ q#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>, B- |6 @4 D: _/ j
#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>% S( ^) t Y( W( t: w
. }( I- F' P& N8 @using namespace NXOpen;
+ l2 F9 ?( I1 v; W2 Vusing namespace NXOpen::UserDefinedObjects;
) n: O8 L6 L9 P9 X8 h2 s3 f, x- @% M! S2 `
//static variables( d: |7 s7 A: I! }7 z
static NXOpen::Session* theSession = NULL;
" D, y; G* Y& o1 v! z/ Astatic UI* theUI = NULL;3 W. B4 n- F) H( j- }8 k) `
static UserDefinedClass* myUDOclass = NULL;# y% Y8 I. l8 m
, {# V8 S2 Z n7 C9 x* g//------------------------------------------------------------------------------9 N: G# x- o/ _- T' w4 \
// Callback Name: myDisplayCB
6 G" q" m# a& s# g// This is a callback method associated with displaying a UDO.
, b, T6 ]5 m5 z% r+ N8 [$ }// This same callback is registered for display, select, fit, and attention point
3 N y" ?- [5 {* U//------------------------------------------------------------------------------. U' d. h- e; z
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
/ y6 a3 m* u& p- m, ]7 u0 u1 m7 ^{
" V0 }% K4 S8 m! W6 N/ o try9 [4 b% \4 Y3 T6 E
{
. A: G% F1 z2 w" [+ A3 {- g" ]0 n // Get the doubles used to define the selected screen position for this UDO.; b. W( e2 N, ^. d: w
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();% Z+ \' s; K' [
( e* O$ M: `2 t1 [
// Use the doubles to define points of a triangle' H6 d1 \- E) c9 Z# [
std::vector<Point3d> myPoints(4);8 j+ E& L8 P; g! f9 N# `
4 a& m- I* Y9 Y& V
myPoints[0].X = myUDOdoubles[0] + 0;
( X0 J6 S. l) K* ], N; J1 S4 ] myPoints[0].Y = myUDOdoubles[1] + 0;
, i1 y6 F i ]. j _; x1 x myPoints[0].Z = myUDOdoubles[2] + 0;
7 Y1 g$ C% T# t: ^+ c
/ V5 t( a$ ^, Q, X# G myPoints[1].X = myUDOdoubles[0] + 100;- N. S( U* a) ` P& [1 p
myPoints[1].Y = myUDOdoubles[1] + 0;. i( u }. y/ J
myPoints[1].Z = myUDOdoubles[2] + 0;
1 c, |8 k- T" p( u+ [
: x# h8 D _ z8 }" K myPoints[2].X = myUDOdoubles[0] + 0;
' s1 B7 A/ p' c& ~; \! r myPoints[2].Y = myUDOdoubles[1] + 100;
! _& E, h. A0 y4 U myPoints[2].Z = myUDOdoubles[2] + 0;' i/ O( |4 H# L. g, A% k& s
3 p9 m4 X- Z$ k" q; s5 n& j* B: C
myPoints[3].X = myUDOdoubles[0] + 0;0 @2 _! i+ [9 A: K* y. I" f
myPoints[3].Y = myUDOdoubles[1] + 0;
( G: F3 [1 l3 X' {$ | myPoints[3].Z = myUDOdoubles[2] + 0;' m% i/ f6 ~* }2 T
9 g# a) ^" N4 P R+ ^9 Q1 ?
// Display the triangle
2 \3 o. ^9 D4 Y' i# i$ u2 j displayEvent->DisplayContext()->DisplayPolyline(myPoints);- K9 }8 c G$ s1 B* _( m' _ B( A
8 ^5 j# e, L: ^
// Display the text next to the triangle
; I5 `5 o9 l2 Z1 ]' E3 G ` Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);
. Z4 E9 |( Q& x+ G1 v5 a displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);1 D/ |% R2 Z+ ]6 c6 i* { F6 b
$ O- p" c1 p5 J9 v4 n- D! r' Y // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
4 ^ c* i D+ m3 x3 J$ M% E2 ] // This demonstrates using UF_DISP_display_facets as a work around
) d8 n9 x4 E6 @$ O6 A( U8 X double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };; \% a4 z9 D0 w
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
- J/ Z! k$ p, P- z myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],
( N4 O% m- B' u4 Y myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };0 p x) ^! V% J% [
UF_DISP_facet_t facets[1] = { vertices, normals };
! p. A8 Z2 I: {+ Q void *context = displayEvent->DisplayContext()->GetHandle();2 J: ~4 n$ S& W4 z& g7 s" B
; s5 a% D/ [2 a: q6 j UF_initialize();& M+ v. v( m# n, _
UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));% {7 V8 H7 V5 l- `; Y8 Q/ N3 g6 J
UF_terminate();
( Q1 ~& J V5 z% ^0 {4 k5 t
+ R6 J8 B5 U3 c8 K: V$ }8 v- r1 q$ ` }! ]% l* _2 v' q$ g0 ~# f' d# ~
catch (NXException ex)# j* K- A' B" L$ A6 x
{
0 @& e% g' W( [* J ECHO("CaUGht exception: %s\n", ex.Message());
: F; N" X3 v$ d: Q6 L/ K }0 q% U" g! i" { {
return 0;3 y, F3 j' u! _% Q3 r5 T
}5 F# H& r+ f( _$ j9 K4 H
//------------------------------------------------------------------------------
& n) Y0 Z/ }1 [, B6 e3 W// Callback Name: myEditCB
D7 r) E+ O: d" O// This is a callback method associated with editing a UDO.3 m+ c$ Z; x3 F+ X) I* x
//------------------------------------------------------------------------------( C6 S1 S+ B4 Y: C
extern int myEditCB(UserDefinedEvent* editEvent)
" P, b4 ?, g( d( z3 L8 P8 k' C{! p) n$ p8 q/ q* m! w' r" v2 O- ^: q
try; t2 Z- V. E& ]- O; A7 }/ l0 w
{
5 e! p8 E1 _0 z& r5 D // required for calls to legacy UF routines
; U& L, S( Z u9 I3 ]$ i+ r2 y t // such as UF_DISP_add_item_to_display
, m$ c" B9 Q0 ?0 g9 g* \ UF_initialize();
$ S; o3 e' z: I* u% v# S* C0 k& N
View* myView = NULL;
v7 `1 _! d( `3 s Point3d myCursor(0,0,0);4 N1 i* C0 K0 y+ X) N, o
' w( k0 v) P L) h3 X, a9 z
// highlight the current udo we are about to edit
" J* L' S5 T1 ?' i' j6 z // this is helpful if multiple udo's were on the selection
* V; w1 v5 W6 Q1 G, l // list when the user decided to edit them) }! `, T3 r4 c* o2 s7 Q: u& {* V
editEvent->UserDefinedObject()->Highlight();3 h2 u S" n) B5 b3 F8 A
$ G+ ]; ~* @; J; c+ L
// ask the user to select a new origin for this UDO/ n0 ?& h$ N0 y- i( H6 S
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);
7 d3 Y: s7 ?* S8 ]5 ?; Z+ I; A // we are done asking the user for input... unhighlight the udo
7 e8 K" ]; l' Y6 f2 A editEvent->UserDefinedObject()->Unhighlight();
2 X$ x' F* `4 M5 ^' C/ ]' q$ F. l( x W, S X" Y% x
// use the new screen position (if the user picked one)
' {( n- f4 P7 b3 F; V if( myResponse == Selection::DialogResponsePick )2 _+ B* Z7 N8 _# ?' J
{' I7 R) [# g$ h
std::vector<double> myUDOdoubles(3);% n7 N8 m3 l- ]& A
myUDOdoubles[0] = myCursor.X;
6 E5 J, B4 m- u+ [+ t! C myUDOdoubles[1] = myCursor.Y;& v# O$ p. X6 \4 h! p
myUDOdoubles[2] = myCursor.Z;
& z& L6 M: P4 A% h4 i. S // store the newly selected origin with the udo ~3 l9 o1 f+ n9 R/ j- l6 I0 ^
editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);" e$ f6 J+ o9 o" B( ?8 ~6 V2 {8 q
// add the udo to the display list manually6 F# [3 w% |; `, [) e* Z* y
// this will force the udo display to regenerate
, S9 K/ P1 v. p5 \" f // immediately and show the changes we just made) S; R/ n% K. T- q( j5 c
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());6 k. [# P) }; m' ^0 Y* @
} U" A; k/ T% E6 d% T! l n$ L/ Y
UF_terminate();
; ?$ D" y/ H4 m/ V2 H } catch (NXException ex)
$ I) Z8 D1 ~) M {) |. o3 b5 E" j! `2 a+ o% ^
ECHO("Caught exception: %s\n", ex.Message());7 G( L" O' E# h& j
} return 0;
2 t, _; u1 `) m+ l3 q4 |7 E1 w: m( N# O0 z}
' h1 V& V: H3 d2 e+ \//------------------------------------------------------------------------------4 s8 ?% k: V; G: Q% t3 z6 g/ @3 X
// Callback Name: myInfoCB/ d. G* M* u1 r9 m# q* |$ [
// This is a callback method associated with querying information for a UDO.
$ d' K1 E- d- e& l$ G// The information is printed in the listing window.
2 x4 B/ l) w" u5 P- @# p2 ^//------------------------------------------------------------------------------
& _$ h" R2 f5 h$ h2 N! E4 f# Cextern int myInfoCB(UserDefinedEvent* infoEvent)
, d) r6 s. {4 w{
' F5 }0 M" J/ {& h* n2 P try" `" a) Z) z4 {$ G& X
{
; Y( n# N0 n: h# Q/ E/ U) A: q: f ListingWindow* theLW = theSession->ListingWindow();) [6 n S# X4 t4 b% P
char msg[256];* H: P% t; ?1 g( m6 Q/ m q. G
theLW->Open();
5 k7 J4 v) S5 ]: Q" Y. Q. A* q theLW->WriteLine(" ");% k+ I9 E- O. ?
theLW->WriteLine("------------------------------------------------------------");" _3 i3 T7 S; |) C- O/ m0 j! C( M
theLW->WriteLine("Begin Custom Information");8 d& w- W w* D( y
theLW->WriteLine(" ");, B: Q5 ^2 D X. d
sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
9 [+ m6 ?$ L: s7 K theLW->WriteLine(msg);
/ K5 a- b* p7 e. t% w& w1 ]0 y; e sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
/ ?* d4 Y3 y- k. L1 K theLW->WriteLine(msg);& ^. _2 \9 ^2 T# }$ e" ?
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();- o; Y5 Z( e6 h1 B W
sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );" @4 ^6 c8 Z ~
theLW->WriteLine(msg);/ x8 }- d; @+ `" S% b# {
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );8 }8 ~5 d+ d6 h3 l" `
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
9 x& X8 D) D/ ?. p0 V4 a theLW->WriteLine(msg);
! G( N3 n. K0 h9 u' Q theLW->WriteLine(" ");* O3 p% s" x$ g- C. |
theLW->WriteLine("End Custom Information");# a% X; A7 F X2 i9 M, T
}
' l/ ? B1 o: q catch (NXException ex)
9 h/ a: m3 _$ c3 c6 Z" k( P. S {. S/ F+ O- E3 ?: B( z* q6 f
ECHO("Caught exception: %s\n", ex.Message()); W$ ?& q& w1 z; f& o9 f/ g
}
- }. F* W! f/ \5 ] return 0;+ W% R! H" {6 x8 x x
}; F) a4 X0 B0 A
- @# R C1 T' c) I6 i//------------------------------------------------------------------------------7 B2 m0 H; r. O7 r$ n
// initUDO: a U4 i5 r/ R) O3 @
// Checks to see which (if any) of the application's static variables are2 t0 j. \8 i9 l7 z r: }+ z
// uninitialized, and sets them accordingly.4 j3 \& p/ Z8 m4 n' c
// Initializes the UDO class and registers all of its callback methods.
4 K( k$ E2 j7 }4 A4 q//------------------------------------------------------------------------------
" S- ~% D0 i9 h* W$ W7 estatic int initUDO( bool alertUser)
7 _- E" k6 Y ~/ D7 r' \{% W8 Y6 j. X- `, f. Q! W( a
try
- i) b0 e9 `9 K+ A- p% e4 z. J* y) z {
) D' @ r* N: r) ^$ `, F* e4 B8 D- Z if (theSession == NULL); R% \: G5 _% W }8 H1 I
{$ y- S8 ~& \. p$ c
theSession = Session::GetSession();' Q$ c; A0 d2 W: b
}
3 y( g# R) Z7 z5 g% a# E& l3 j7 A if( theUI == NULL )) \! v; K/ o q/ Q
{
& ?8 {# T6 n( K5 c' O5 r, H theUI = UI::GetUI();
7 F8 W: y w5 ]* |* f k1 E! N }
* J. j' U8 U# m* z% q1 h0 { if (myUDOclass == NULL)9 L1 n l% Y' F6 Q' C; m' S" ?
{
5 w; M# h( a5 `0 C- Z6 p i# ? if (alertUser)
' L/ O `) K: Y. X8 C7 h {
: @- ?' _4 @. T- j7 D" ]+ M+ o ListingWindow*- ^8 y* j* O. g) C4 \. j" x# l
theLW = theSession->ListingWindow();) X/ U3 H5 `9 P* w8 }4 l; |
theLW->Open();7 G% f. Z4 Q$ ~( n d
theLW->WriteLine("Registering C++ UDO Class");
, @5 L3 S3 B9 {$ r M/ m* G3 o! f }
4 a: p4 B- C `; Y0 Q // Define your custom UDO class
8 G1 [' D% s* t& x* U; e4 a8 Z# I myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");2 B" N9 Y9 G7 x/ B- Y& m
// Setup properties on the custom UDO class5 y8 i. n+ s: |
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);
$ |% ^8 s/ ?: }7 r* f // Register callbacks for the UDO class$ f9 Y6 I$ q! f$ A
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));2 F _# {5 C; Q/ \" D K% `
myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));
! U$ R% q3 k* Z+ N myUDOclass->AddFitHandler(make_callback(&myDisplayCB));
. ^; m8 U( x( `4 K myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));
; j% [1 J& p) R myUDOclass->AddEditHandler(make_callback(&myEditCB));" b$ ~' l, \: A* x! X4 o! F" f$ w
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));3 S# f4 d) S/ K( }; f
// Add this class to the list of object types available for selection in NX.4 I" ~+ o5 N; j& t& A; u. I
// If you skip this step you won't be able to select UDO's of this class,8 S ^" l: T* R# |2 p) T) R+ }
// even though you registered a selection callback.
" D9 L3 K4 }0 g0 f8 P" d) e theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
) Y5 U, r2 n" n4 E9 }0 [2 B }% \* ?# K) c7 |
}
/ q; p; t w/ M# K7 x catch (NXException ex)( r v4 u" E9 P! t; e; f' U
{
; p! z% T: {* T4 C5 S* W$ ]% H% } ECHO("Caught exception: %s\n", ex.Message());( y9 a/ X4 T+ J8 S0 D
}) z& | Q: j9 h/ u* ~* S7 k
return 0;
t* R4 v( Y- ]- n& n}, e% r( v7 `' K
M }5 H0 b z o9 ` Q# x//------------------------------------------------------------------------------. u# [3 g+ X2 `3 p+ |7 L7 U
// ufusr (Explicit Activation), ` `7 @; S3 f0 E) K4 x2 V3 m
// This entry point is used to activate the application explicitly, as in- J- X8 _0 f! t3 a5 I" I
// "File->Execute UG/Open->NX Open..."
7 o9 C( Z7 T3 i( |4 q) [//------------------------------------------------------------------------------ e$ \/ l6 o9 i. `
extern void ufusr( char *parm, int *returnCode, int rlen ) Q: ]6 T( I# X9 q; @& n/ A. R. w
{( t; W6 q b: p5 m$ m) z
try) ]0 v% O/ h8 w9 r) h% \$ d
{
+ B S. e8 J& l+ U* _( t // required for calls to legacy UF routines
) u9 e& }# A* [5 R' k4 z' C // such as UF_DISP_add_item_to_display! s4 z \ A. k
UF_initialize();
A9 C) z+ @0 d* |
5 t3 m5 c7 n3 `* ], m8 I4 P! ^; J // initialize the UDO - if we didn't load this library at+ j* C( J; K6 w4 [* k$ i
// startup, here is our second chance to load it. k% r; o+ p8 N# J
initUDO(true);! B- |! k) @. f7 U, S
7 _: l: z* g% I1 Y# P // if we don't have any parts open create one7 G4 y/ ~( }6 ~: d) `$ A2 i: q8 w
BasePart* myBasePart = theSession->Parts()->BaseDisplay();
8 z' r, |1 y6 i/ n if( myBasePart == NULL)
( z0 @1 k2 A" H1 _ {5 ^- o* c2 c" x- B
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
+ A# {, y6 ^+ x K. l; V/ ] }
; _9 w: G+ u( e# s$ O: b! m7 [' A. ^& A
& o' v2 s0 M o: ?3 L" s1 a7 n View* myView = NULL;
4 ]/ l: c2 k- g& S) N$ W5 n Point3d myCursor(0,0,0);$ E( @; N6 |/ {0 ?9 j4 S
5 t! g9 p# d3 p7 v/ g( ~4 q
// ask the user to select an origin for this UDO+ M& w7 q" e4 R7 E9 Q
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
7 {7 n3 Z( }& p+ k. @ if( myResponse == Selection::DialogResponsePick )- v- [8 s: G9 T5 n
{7 f* C6 H* A; [6 n) v5 W5 |
// The user selected a point - go ahead and create the udo% \( H9 c7 ?: E5 H
UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();
6 p+ U8 Q: w( `9 j UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);
4 m' o( k/ K7 t+ n: T+ z' _ // set the color property of the udo - just for fun :). S+ Z# ^" P& B. T
firstUDO->SetColor(36);
* @ H0 H- L" U4 \ // store the origin selected by the user with the udo$ f4 ]' U# J. r7 E+ ?4 Q
std::vector<double> myUDOdoubles(3);' u1 ^5 \: o+ [* [! |+ c
myUDOdoubles[0] = myCursor.X;) u8 i5 f! B/ L* |0 M, y" `
myUDOdoubles[1] = myCursor.Y;
7 g% T2 E% _+ J6 H/ i3 v3 L myUDOdoubles[2] = myCursor.Z;5 M% s4 h6 f2 i6 Z$ V& G8 \" D
firstUDO->SetDoubles(myUDOdoubles);
$ k* J0 \" H: v3 ^4 `0 ]4 l // add the udo to the display list manually5 q$ H0 f" @# x9 g4 Q1 _
// this will force the udo to display immediately
1 u* @7 E( v& |! A. y" ? UF_DISP_add_item_to_display(firstUDO->GetTag());* {; T; D* i$ l/ H+ w
} p3 t# |( ~9 H. O% F4 J1 j
UF_terminate();5 d( N3 M& h* t9 C; f2 }
}
1 I5 `1 F1 m& b8 d& j& X, @ catch (const NXOpen::NXException& ex)
: Y' J D$ S& g! q3 ] {
2 ]7 ^- w3 d* h1 i, E7 V/ z' c( ` ECHO("Caught exception: %s\n", ex.Message());
7 t, `- e9 O* }+ t }
- l& B2 n( w( ^2 \! E" |% O. D}: ~4 k! y4 D1 P4 X- C3 p7 z; b
) ~5 D8 a( P: [- w1 n' E9 L% a
//------------------------------------------------------------------------------
- K; r6 i. C2 Y5 \" C// ufsta
% h0 |4 n7 K. n% B: b3 M// Entrypoint used when program is loaded automatically
+ z M3 {/ c1 R% S! a// as NX starts up. Note this application must be placed in a
6 W, ?- Y$ P! X// special folder for NX to find and load it during startup.
; |6 q- K$ }; x// Refer to the NX Open documentation for more details on how4 U6 d4 q0 p# N7 W6 g
// NX finds and loads applications during startup.
8 F4 M# [" \ J7 J% K, O4 f//------------------------------------------------------------------------------2 N3 W( M9 V# r2 ^1 P6 K0 n8 n
extern void ufsta( char *param, int *returnCode, int rlen )
( \: ~8 f) Y, P$ Q( O1 |{+ L, Y* Y- O- K2 ?
try
* h7 R; ^& q- x" [& N5 A: t4 [! y( R1 N {1 C! O+ R, Y/ a9 e
initUDO(false);
) u3 _1 L: o3 |1 D' \ }7 G: ?* p6 t) a) G; q) t, k& U! a
catch (const NXOpen::NXException& ex)
+ h7 i7 J! m0 z& r+ p {
: P" `, X. q- f4 z ECHO("Caught exception: %s\n", ex.Message());
% Q2 n- H2 {" H3 Z; U: H" [* `( U6 J }
" x p% l, z8 p+ w1 c% W; |* z}
& v0 }0 ?" k9 z% b1 D& c
) f; H- D& G6 b9 C- ?+ q* C& C! E//------------------------------------------------------------------------------
9 Y$ Z% m" e( h% s; ^4 o7 E// ufusr_ask_unload
% K% Z2 L' K% x0 T- R- S// Make sure you specify AtTermination for the unload option.
8 b* {! t1 }3 Z- E$ ]// If you unload the library before the NX Session Terminates
) M: p, g) M2 c# r// bad things could happen when we try to execute a udo3 K/ _* ~. w0 k3 K
// callback that no longer exists in the session.3 z* q( z q' X% |+ N/ k, T2 p; _" Y
//------------------------------------------------------------------------------
[* l6 o! J, b2 f# ]extern int ufusr_ask_unload( void )4 M3 X: W# i% Y. D
{
* u! q3 v% k# z, C( E return (int)Session::LibraryUnloadOptionAtTermination;
" F K/ s, _& R* [3 {5 K2 }9 B" f m}1 J t1 O7 Y- [! M( O
! ?$ S8 V6 @5 h9 i
|
|