|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
0 ?) }0 x3 l, r
4 {: S+ c1 b1 S# _NX二次开发源码分享:NXOpen C++创建UDO的过程
6 N8 p: i$ r1 ?1 b8 x. c2 h2 V' _: ^- O; ]% [
% {! X& ?& t# K* r, oUDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
# U+ ?4 j. L: V4 K* ^% {
: y7 z+ Y5 M& c! a# `* j9 B4 F3 y5 k5 F; \
( {/ X \9 U0 M: p8 Z
#include <stdio.h>' D2 \& o0 b3 q# e
#include <string.h>) A& R# r' G6 g
#include <stdarg.h>
# r" n( }: T/ Q& k, W3 z#include <uf.h>
0 Q3 i) p, y' d3 c#include <uf_ui.h>
0 x3 @; m7 g0 P* g% l6 L+ }#include <uf_exit.h>
3 @$ L' l) Y3 _: i' [#include <uf_disp.h>
5 ^# L f' }, L2 m
! H7 W2 @3 g% o2 [+ a1 ~static void ECHO(char *format, ...)4 G7 b8 N+ b7 z. R0 U' \7 c
{
; L9 K( t, o3 W char msg[UF_UI_MAX_STRING_LEN+1];% ]! ?2 U, k, f( s" Z) b, A M
va_list args;
1 y# x% m/ g' O va_start(args, format);
$ _. v0 W, j" X& H6 H4 t vsprintf(msg, format, args);
/ G: z ^% _( ^- ]- O va_end(args);
: ?& j' C( U& t: c UF_UI_open_listing_window();" b. R* |/ O+ B# X* E
UF_UI_write_listing_window(msg);
* T* |: g7 n5 `" Y' A UF_print_syslog(msg, FALSE);* I' l7 G" t0 w# V# d" B, V; q" g
}
3 f* g, w. }. o( z- Q5 l' k" h
6 p. m" p# V k) C. ?#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))' S9 ^) G7 g3 }% q+ s. ~: B
) ~2 \* }; v8 l8 W, @
static int report_error( char *file, int line, char *call, int irc)
- @/ F* q5 |8 D' w ?5 ^- F{
2 n2 s# ]/ A& Q0 k. ?' S if (irc)& y" ]6 n, u! `# }! S! w
{
# t. ^, i) C7 }! M char err[133];
$ p6 e' T4 j$ {, G+ W) n$ M/ D# g/ l' R
UF_get_fail_message(irc, err);
% i) G& Y i+ M5 |$ T- z ECHO("*** ERROR code %d at line %d in %s:\n",
4 W) O$ m# R0 ?# Y4 Q* B irc, line, file);- m2 y# `8 ?* b
ECHO("+++ %s\n", err);7 D$ ^3 t8 ?0 `8 o9 H6 t3 _* ]# w$ j
ECHO("%s;\n", call);
( U" f; a5 h; R/ r3 { }' W. [4 U8 G# A* Y0 q0 w/ @
3 ^/ ~+ e4 _/ d8 X! K" y/ J0 r return(irc);$ W+ v- R! G2 a8 S
}
$ l) l* v% h$ b: C! t/ R# `/ n% t$ `$ b3 v
#include <NXOpen/Session.hxx> 2 ~; u, E' s, T
#include <NXOpen/Part.hxx>
, C' H8 |' m) w2 {( @#include <NXOpen/ParTCollection.hxx>
: J- Z* P, _9 R! b/ K0 \* e#include <NXOpen/Callback.hxx>; e) o0 T( I+ o3 W4 ^
#include <NXOpen/NXException.hxx>
( B8 G& _' |) C( _#include <NXOpen/UI.hxx>- P2 q( W% r! w0 G2 R, t
#include <NXOpen/Selection.hxx>
5 ]: ]$ f! v1 L#include <NXOpen/LogFile.hxx>7 V* A3 m- v! r' F% K7 a* q
#include <NXOpen/NXObjectManager.hxx>: j; h3 q3 I% v w
#include <NXOpen/ListingWindow.hxx>
' x/ V# r3 K/ q4 K#include <NXOpen/View.hxx>& U! L% ~9 S0 _: T$ a& U
; u) C4 H, r' y; \#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>6 v m! \" y: P1 F& d! g
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>
" @2 V. @7 Q* a4 O" w8 s% Y7 B#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>
6 x- @$ ?/ i! f" Q8 X#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>9 ]3 ^/ ~; Z3 l& }" T9 ^
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>" U0 Z; I1 a5 F' _2 R* S
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>
- `# v* I' n# n#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>
3 L/ l( o! b) F$ k8 R#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>, I* n& s+ V9 f9 o
7 Z# M, x/ B. I
using namespace NXOpen;
7 d, I2 C6 n" o) Z: ?1 \' I9 ausing namespace NXOpen::UserDefinedObjects;
5 k+ g, B: _7 v: v& y
; a, }2 Z( {& j B `/ r2 M% k//static variables
9 n7 s0 d2 e* s& n+ y/ ostatic NXOpen::Session* theSession = NULL;! A1 W9 W% c5 e1 m2 L
static UI* theUI = NULL;
3 }9 ^: L4 {3 Rstatic UserDefinedClass* myUDOclass = NULL;
! r) x( g! X5 Q& E0 @" ?" \0 Y! j, c9 l' d; @ S# C3 {
//------------------------------------------------------------------------------% z& x- C% w" L( k
// Callback Name: myDisplayCB
! r9 c/ \% N7 V6 t6 m. h// This is a callback method associated with displaying a UDO.
% e* A' {' O' z3 O! u" x& ^( j1 G// This same callback is registered for display, select, fit, and attention point8 q9 ~) ^ b, Q- M" I+ G
//------------------------------------------------------------------------------$ o2 n5 O q$ ]% B' Y5 p
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
, n% a. K# Q7 ^& n2 {{
6 p; W; E# a2 j2 l* u3 e. I( \ try! x8 N; H) P; d/ f( }. C0 N$ p
{/ y* l- _; M2 A" _( H
// Get the doubles used to define the selected screen position for this UDO.8 ~& f6 t i K9 Z1 \$ J
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();8 E9 X4 p" I( r* ]+ I0 X6 S
# S, y4 x( l+ P // Use the doubles to define points of a triangle- Z* U( c% | Q
std::vector<Point3d> myPoints(4);
9 \% d* [7 }! e8 [: O* D/ P: j6 z
6 m- r6 F9 ^0 z7 y% Q myPoints[0].X = myUDOdoubles[0] + 0;* F1 G* U% `' a% w- g
myPoints[0].Y = myUDOdoubles[1] + 0;9 H, V, N# c+ ?7 N0 D v* F4 W0 Q
myPoints[0].Z = myUDOdoubles[2] + 0;# _; Z5 a6 }7 s2 R5 ^7 N4 w
0 S# t$ s7 N; U myPoints[1].X = myUDOdoubles[0] + 100;! F% X/ I* h \9 F
myPoints[1].Y = myUDOdoubles[1] + 0;
7 F1 Z8 g; B# m& i5 n4 K myPoints[1].Z = myUDOdoubles[2] + 0;
: ~: B# S& J2 L
2 d% Q% n: u) d# H# J- l myPoints[2].X = myUDOdoubles[0] + 0;
9 `# s, Q& R# \) i myPoints[2].Y = myUDOdoubles[1] + 100;
! T# ? `6 L1 X; f; H myPoints[2].Z = myUDOdoubles[2] + 0;
7 y- W1 J/ A8 x: D( x
" ~2 X: v: G, @# v0 B4 z myPoints[3].X = myUDOdoubles[0] + 0;4 F& h7 I7 }$ o. i4 X# @
myPoints[3].Y = myUDOdoubles[1] + 0;4 r( L7 t( W. I( c6 _) L, g
myPoints[3].Z = myUDOdoubles[2] + 0;
3 ^! e9 p2 \$ _; t, e, v2 I) y5 h {" F, b2 d! `8 t) b
// Display the triangle
! c) D, c' n& j4 \/ \ displayEvent->DisplayContext()->DisplayPolyline(myPoints);5 D" n7 Q% a, D6 ~2 H( L+ ^. W
' _ G, b1 d0 b% o& r7 @ // Display the text next to the triangle
( `* Y( v6 J3 K K: f/ P* N/ i Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);
* E* |5 m7 s: p8 O; [ displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);
) z/ ?4 X% W6 O B0 P+ }: b
2 e4 t* [0 {- i8 j% t( k& o& j // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653; p- Y8 u% b% F
// This demonstrates using UF_DISP_display_facets as a work around9 m; S4 m9 Q0 i! o& e l
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };4 h! S- m1 ]6 J# V) C- p: F; v
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
: h% k0 c5 D# k myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],5 f" E& @& \. L
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };! B, i$ W( m) S
UF_DISP_facet_t facets[1] = { vertices, normals };
+ Y# `/ m( U, G6 Z! B2 f void *context = displayEvent->DisplayContext()->GetHandle();
4 X- A# X K( c, c) A% a
1 y$ H! b' s( p1 r' R UF_initialize();
3 G+ w" L/ ~/ |$ H7 k8 L1 a UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
5 \/ v3 s& i& T4 p. _: J& M i UF_terminate();
& v+ p. E' B( z& ?+ ^. Q4 t( `% S+ W7 M& Q- C* P7 x0 U3 r% m: J
}
6 _) ~7 }& ~0 l+ J* U catch (NXException ex)
4 d, t: S i+ ?- Z, [ {
: ]# Y6 Y. X2 c% e3 U I ECHO("CaUGht exception: %s\n", ex.Message());
$ U9 {5 F! B& i }
( v! X" ?5 |( v/ ^- S' S7 N return 0;. [ u$ s* a2 k) N( u
}
' H6 \" `, F! N) Z//------------------------------------------------------------------------------
. B0 F) y& M( C4 b// Callback Name: myEditCB
( s( r/ a5 U1 _// This is a callback method associated with editing a UDO.8 `# \$ v- c& z2 i+ Y* {1 ]7 {
//------------------------------------------------------------------------------' p; F6 d% a' f8 j7 I% J o) G: Y' Z
extern int myEditCB(UserDefinedEvent* editEvent)* V" v P+ B1 j* Q
{
6 \% K- A+ `- @: q2 Q& ^- Y. b0 X. D5 L$ a try) s3 t/ h% Q" v
{4 Y3 M# L$ c, g' h- s* g
// required for calls to legacy UF routines. U. f$ Y0 E6 Q5 e
// such as UF_DISP_add_item_to_display
; V4 Z% Q. h9 n* w, D8 _ UF_initialize();
* P3 G+ Z i2 d; O+ O. V; P, b3 s) l. d6 H- x8 U$ Z# ?
View* myView = NULL;' h" p" [! n4 n8 n3 M
Point3d myCursor(0,0,0);9 h' K3 Q, m# Q9 m' |8 C0 r
/ N) k7 S+ u2 H* O8 g/ C) F6 S
// highlight the current udo we are about to edit- G- t: l3 ]( X' g
// this is helpful if multiple udo's were on the selection2 v+ M) _' y) S# W* [! O8 C
// list when the user decided to edit them) \6 S& H) o7 W' j2 H% ~- P
editEvent->UserDefinedObject()->Highlight();
/ c5 g% y* G/ }* H0 Z, Y- r5 `1 ?" i" [% q/ r
// ask the user to select a new origin for this UDO
( k- s. P4 `5 d" r! I$ |7 k6 g Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);
2 }/ i1 B& j0 h: q // we are done asking the user for input... unhighlight the udo. c* r8 F9 h+ y8 I$ f6 ?
editEvent->UserDefinedObject()->Unhighlight();1 {, m" v1 O. S6 P% T0 \
( g+ ^- B/ Y x+ ?
// use the new screen position (if the user picked one)
3 j( u3 b) `6 {' ?) M( y if( myResponse == Selection::DialogResponsePick )2 s# p; Y6 X5 g; A: |
{4 a+ H/ o7 S, j
std::vector<double> myUDOdoubles(3);+ J: Q, ^. E& `1 B# y- u0 I' Z6 S
myUDOdoubles[0] = myCursor.X;9 S5 P: G0 `3 p) P3 i% ^
myUDOdoubles[1] = myCursor.Y;
5 W `4 m. `+ m5 ~) j M+ k9 g myUDOdoubles[2] = myCursor.Z;
3 b1 i9 Q" k9 A+ ^ // store the newly selected origin with the udo
& ?* A8 o, D8 v8 B; R$ } editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);2 ]* [2 Z$ c. r9 k4 T" u* b2 r
// add the udo to the display list manually+ D; |) O" T/ n! M7 X
// this will force the udo display to regenerate
6 N. ~2 g" A+ R1 h5 a // immediately and show the changes we just made3 M3 `1 d/ n5 q/ w) _2 \
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());
3 M% x( w, @! V0 K4 f; L }; O1 R; d! r' o/ [' E
UF_terminate();
) K1 ], y" ~9 Q# `6 O } catch (NXException ex)5 }; |5 N+ L+ }7 J
{- g' v& a S2 [% S" g. i. `: `
ECHO("Caught exception: %s\n", ex.Message());$ e2 o4 o3 y9 f5 b
} return 0;2 p0 G9 m6 B" [* v7 N# K1 e- S P
}
d$ l W2 B$ v9 Q//------------------------------------------------------------------------------
1 \. R" p7 m7 `2 P; d% h// Callback Name: myInfoCB
2 U3 [4 i$ a; t9 b// This is a callback method associated with querying information for a UDO.
! J% i' w. F' E( ?// The information is printed in the listing window.
, Z/ b( m) s- g! I* T0 D//------------------------------------------------------------------------------# O# `# T* B8 ^3 K
extern int myInfoCB(UserDefinedEvent* infoEvent)$ R" u. O) j4 u# S$ ~
{8 b$ W; r1 s' H( |. O7 f
try
; {$ L# w% _: g, N; @ {% _2 B3 n; Y8 F7 P* K
ListingWindow* theLW = theSession->ListingWindow();# s! l9 z, N9 Q% b5 n* I+ e
char msg[256];
( t3 u) s. A' l, q6 t( V U theLW->Open();
1 y1 \/ |! @% |2 J$ u! }" R, _ theLW->WriteLine(" ");% F( e0 H% f' L% h- q, f! J& ]8 [ i
theLW->WriteLine("------------------------------------------------------------");4 G& A- y2 y, h8 ]6 m
theLW->WriteLine("Begin Custom Information");
9 N4 W& J1 [4 m0 w theLW->WriteLine(" ");! E- a& \4 ]5 A" ?9 i
sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );' g, A( Q4 ?# k+ @) Y8 q; `
theLW->WriteLine(msg);) u2 ?. l+ x. G( }/ q. H* ^; T
sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
+ c& k. K1 d( l1 Y# n1 |) Q theLW->WriteLine(msg); p. r$ p4 i8 @7 |; K/ F5 d% f3 b
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
) s1 G" u& o+ u: ]' Q2 V6 j/ R sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
/ A7 W# n' W2 N; M( D. ] theLW->WriteLine(msg);4 C* C6 o2 [; `* F& a; S( W/ ~
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );
* f9 V% u, f( g* X" d theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] ); } E n, l" M+ {
theLW->WriteLine(msg);
C7 W7 t/ s, g- w' V% C theLW->WriteLine(" ");
" ^ {% x4 \; T theLW->WriteLine("End Custom Information");
7 `- f8 T) d' m }, x3 O) y, w% L0 I: B- e4 l6 n" }3 a
catch (NXException ex)6 d" m7 h+ n. b# e
{
: r$ ]( N6 T: l0 s, U) } ECHO("Caught exception: %s\n", ex.Message());
# f8 g O+ O) ~6 | }
- P/ }) Q6 d) J2 H( {8 e return 0;6 @8 \. C/ b; @
}1 l5 ?2 q& c+ F+ D! o( z
9 E; H7 O" \- x( _3 s
//------------------------------------------------------------------------------2 G8 g5 n) S, |9 q/ j) F& h- n, _
// initUDO
1 {# H' t8 l+ I1 z& l// Checks to see which (if any) of the application's static variables are) P: |9 U4 u) T& Q* W! E$ N3 x. ^7 i
// uninitialized, and sets them accordingly.+ ~2 V6 O8 T4 H$ N6 h
// Initializes the UDO class and registers all of its callback methods." h. ~7 b5 Y, K. E
//------------------------------------------------------------------------------6 u8 [( |. c4 _2 B. D# |
static int initUDO( bool alertUser)
# j# B' G. a! k6 a8 W/ }6 ?" G+ O- x{
4 e# w" \9 l7 b try" n& B: V f ~, T. y
{
5 P3 ?, d e9 D+ o& ^" Q7 Y! V if (theSession == NULL)
8 t4 ]/ A! s5 o! { {
. b0 \0 J# S1 c2 I theSession = Session::GetSession();
. P" L4 t: [, s }7 f+ }7 i% X; W) ~9 c8 ]& F: L: Z
if( theUI == NULL )
0 @- g7 \2 \8 ~4 l {
7 E5 o- j: z9 z7 D3 ~' m theUI = UI::GetUI();
6 n0 D5 ~: }7 P% v5 g }2 D k9 I3 ^1 i. W. u
if (myUDOclass == NULL)
+ R$ f( h" u0 j3 r1 Y {
( K8 ]( c- Q* G% @% _/ U# [ if (alertUser); |- l( h* A6 \6 D7 C" t
{
0 D1 j! s3 I5 q9 B: r ListingWindow*
% Z/ b) E, Z: P. Z; f0 p theLW = theSession->ListingWindow();
! x* j# B9 D' [8 d0 y% S5 \ theLW->Open(); t, u# I8 }- h! B+ b3 R% ]
theLW->WriteLine("Registering C++ UDO Class");
( d9 j7 b8 @) L9 D }5 y2 H, Z9 T, z* E# V! G
// Define your custom UDO class
- k- Q' a9 `6 ^+ r myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");
+ i+ a3 r9 ?) B& w4 o% r // Setup properties on the custom UDO class
: R9 |& B) B% A myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);
1 @) G$ ] y1 q% d. X" C // Register callbacks for the UDO class6 c8 M# \ i+ W: v& L& p
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
& h. m Y8 r! g4 n% D myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));
, ^3 V, {+ \* c9 K myUDOclass->AddFitHandler(make_callback(&myDisplayCB));7 C1 u# K; P& {4 ^5 u+ @
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));) J6 _3 {# d# B' V; f
myUDOclass->AddEditHandler(make_callback(&myEditCB));* u5 O( `. Q5 S8 ]+ Y
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));7 w" {8 Z) T* {2 s" o
// Add this class to the list of object types available for selection in NX.9 ~1 A. J( k3 j& H+ v n
// If you skip this step you won't be able to select UDO's of this class,
; e9 z1 D* x0 Q0 C% ` // even though you registered a selection callback.0 x1 n, [6 K2 o- a/ @" e
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
! v5 n4 g0 ^& v1 @, h; g }& }7 u' E) A6 f8 P8 W$ b
}" j3 ~ E, O. ~
catch (NXException ex)& L" y6 p, d. @
{! d3 T/ w; s3 j3 k5 H
ECHO("Caught exception: %s\n", ex.Message());, g( B8 `# A9 P- G4 \& p, h4 M
}% C# H" r4 @- X; s
return 0;% s3 Q/ r" Q* \3 R3 P
}
% L/ v% `3 v6 _# {; [3 w* I$ q" ^3 }/ T1 ~4 L! e0 B/ |. s" E
//------------------------------------------------------------------------------( n7 o! ^( \- P; T T
// ufusr (Explicit Activation)# n3 ~' T, o: G: U* d+ @: N
// This entry point is used to activate the application explicitly, as in
, z$ p: j4 ?2 h// "File->Execute UG/Open->NX Open..."
/ |+ ^2 s# N! U6 u' T//------------------------------------------------------------------------------8 ^6 U' c3 Z' U
extern void ufusr( char *parm, int *returnCode, int rlen )9 A2 U- j' ]5 M% e
{
2 h! d, K6 [0 S$ h( q \ try6 {8 U @# I" M8 {: h
{
. X& }8 J* a9 o O8 B6 q1 T' j // required for calls to legacy UF routines# W \9 o5 T b
// such as UF_DISP_add_item_to_display- f- p. N6 \$ s, k6 v7 S- @
UF_initialize();
: P0 u: S @4 P6 i- h& r% V
% T" \/ F" m. z$ s. T( K' i( C/ Z // initialize the UDO - if we didn't load this library at
; ^ {7 t4 @5 b, ^( p // startup, here is our second chance to load it# F* B6 m/ \0 i+ j7 \# Y8 s
initUDO(true);
* S0 O9 t% _( @' s) h1 p& ~2 M0 U( ]& {, N3 D. F/ ]9 H
// if we don't have any parts open create one
/ z0 B: r' q4 \4 f- y" Y BasePart* myBasePart = theSession->Parts()->BaseDisplay();
, P8 _& Z& d: s if( myBasePart == NULL)' j9 g# G: {+ E3 v5 j" S7 z
{$ U3 I% b3 b I
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
7 w) e2 {+ Q# J) s }" |! }& t# |. g, W: M
- G: ?/ n) i! A8 e View* myView = NULL;
* H& T. [% Q9 C+ W1 u Y Point3d myCursor(0,0,0);6 A- L3 Q9 t4 b; `! Y
0 | j1 w/ r- d, g // ask the user to select an origin for this UDO: d, G8 Z& B( q! G2 S
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
0 _2 O2 e. d* L( k( o, h if( myResponse == Selection::DialogResponsePick )
7 E2 ]3 z! Q# M9 \( p {
+ u% e& a% i0 k { // The user selected a point - go ahead and create the udo
: x9 u0 I7 X0 s) u" U: Y4 [5 ? UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();
0 x- I# z% _( q4 f UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);
) w% G! b f' ` // set the color property of the udo - just for fun :)+ ^) e4 |8 ]0 G2 B% I" V/ a4 Q8 a
firstUDO->SetColor(36);, ~. z' _+ Z4 R9 v
// store the origin selected by the user with the udo8 B! s: t$ c i5 T1 Q
std::vector<double> myUDOdoubles(3);% F- f. k( d1 r" h) t9 l
myUDOdoubles[0] = myCursor.X;
- _% d; f' x& x5 I. G; W myUDOdoubles[1] = myCursor.Y;
) c' h' e# E1 a; S" o5 g# W5 M3 ?) C myUDOdoubles[2] = myCursor.Z;" M+ Z! U+ w* Q
firstUDO->SetDoubles(myUDOdoubles);$ e7 V, F( z% g; F8 {& P! X
// add the udo to the display list manually
) c# D' F( o) s+ O o) A // this will force the udo to display immediately8 Q3 e! D$ ?+ ~8 Z
UF_DISP_add_item_to_display(firstUDO->GetTag());6 a# C% Y8 Y5 h% g% K6 I
}
3 v8 b- ^! G8 w# k% B9 L* h UF_terminate();
) [5 f3 j0 U0 ^8 {( z3 Y$ c }
5 S6 ~! J" T" ?3 \3 L' X; I+ _ catch (const NXOpen::NXException& ex)3 K1 E( i" t w
{& s& W. e+ m2 Q# `* p, j5 @
ECHO("Caught exception: %s\n", ex.Message());
- K6 m r; L1 |) p }7 R; [% R* U8 H9 @/ \
}
1 L- q" p3 Q t" z2 N
1 P2 T7 i O2 O3 |( n//------------------------------------------------------------------------------
$ R+ Y y5 j, A- t4 o& u: f// ufsta
) s6 U* G0 C/ ^' |+ X// Entrypoint used when program is loaded automatically
1 {. X- M1 z+ W; m' l5 ^3 z// as NX starts up. Note this application must be placed in a
& s2 j' B: p+ c! ?% x$ J; f. f// special folder for NX to find and load it during startup.: k* b+ b! C5 r% Y" \
// Refer to the NX Open documentation for more details on how
L/ T& P" J* @ c9 C// NX finds and loads applications during startup.
# ^% b Q6 _$ R! e//------------------------------------------------------------------------------' D9 f; H2 t5 U7 x* e2 X
extern void ufsta( char *param, int *returnCode, int rlen ): p" k/ z( G* r, b( e" s
{2 h; D: G! Z; s$ e6 x' _/ O
try: N( r* B! I7 Y9 i7 Y. a
{/ }3 I6 p1 V, n' m: Z& w. e2 N
initUDO(false);
$ |7 C j1 B9 V& n1 b" Z* l }
% T- V' ]8 g- T0 y2 z catch (const NXOpen::NXException& ex)& U/ G5 H0 ~8 a& D$ {
{
|' R! Z! m7 v3 c- C3 l1 f7 \ ECHO("Caught exception: %s\n", ex.Message());
# d9 a: \( l, f+ P5 @ }9 S2 } p4 K% Y+ J7 J0 Y) Q4 v5 r' k
}
! q+ E9 U1 v# R% ~
& G' b% g* ^" O2 n, d//------------------------------------------------------------------------------' i. @! n) x; [8 O5 A+ C
// ufusr_ask_unload8 `. g! Q+ F. f x; G& t( C
// Make sure you specify AtTermination for the unload option.( U' Z ~! a5 f
// If you unload the library before the NX Session Terminates
2 X* h9 D, P. D. t1 J& \0 m// bad things could happen when we try to execute a udo
6 r' _5 _6 s' @// callback that no longer exists in the session.5 Y9 B0 ~, L. K* P
//------------------------------------------------------------------------------) W( d$ N: B: D/ c/ K: z
extern int ufusr_ask_unload( void )5 d0 I0 d1 e) @2 I/ O
{
$ v1 B9 L8 H* l" ~ return (int)Session::LibraryUnloadOptionAtTermination;9 U1 k \8 F, ?+ n+ m
}
+ e6 k" A7 u0 Z
# \2 {- M& V+ k- k8 }& W |
|