|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
2 ?, t6 F' n! V) R$ ~9 O N5 d ^( d# Y. b$ e: N' m4 A
NX二次开发源码分享:NXOpen C++创建UDO的过程
8 K2 Q9 W0 ^# ]3 T" S2 u
5 u0 F# m& f( [; b B6 L+ L4 a& `' r& j
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!, T5 J) t4 a, Y! ?; h
/ N+ K3 N* p, i( ^" e; w: l- j
( [& W, t7 z( Q$ z N2 P( S# \6 i }( T
#include <stdio.h>
. X6 x& A5 }& P; ^#include <string.h>3 l; w" Z1 R4 K0 t
#include <stdarg.h>5 _! I2 w1 j3 E+ M2 g1 _
#include <uf.h>
J6 j7 P! O- x' U- U0 b#include <uf_ui.h>
" A, ^/ S6 l! ?2 N" i6 @#include <uf_exit.h>% a7 L% m! F* Q* V3 ?2 t! F5 J
#include <uf_disp.h>
" I* u, O8 Q& ~3 q4 B& D
; ]# u9 o) h1 z- ]+ [) Ustatic void ECHO(char *format, ...)
! Y; v- D1 ~: M{
7 S% F! s4 y1 J1 c) Q; _6 ^- p9 T char msg[UF_UI_MAX_STRING_LEN+1];
0 ^+ e3 J ?( G C- A va_list args;6 J/ Q9 M' j, u6 n
va_start(args, format);
0 p8 Q7 ? i8 q6 f5 q vsprintf(msg, format, args);! s# B, l* N, s8 d
va_end(args);" }6 N1 e/ Z% Z F) p; }
UF_UI_open_listing_window();. n! U+ ?, y* e$ w8 D
UF_UI_write_listing_window(msg);6 S- t3 [* v0 S; M
UF_print_syslog(msg, FALSE);
& E$ ?6 u& t% X6 E1 ^}3 }4 A0 }: W8 ]$ q& Y
! O7 i. _* Y0 H# w#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))0 c' d0 }0 ~9 Z1 B+ D ]) r2 H
3 e' C* O2 G7 @& [3 A0 E) v5 Z B: astatic int report_error( char *file, int line, char *call, int irc)
+ i8 X, d8 D; G' P5 G( _{
& G( e4 c$ R. w7 ^9 e if (irc)
& t m! _) V4 z! ~" _. p {- x/ F( N y' G) L z1 L) O
char err[133];% q2 u* ]2 _3 |, N; R( v2 ^7 r9 o
1 U4 h- r) F+ e8 z7 S( W UF_get_fail_message(irc, err);
4 f9 \: G, q) P ECHO("*** ERROR code %d at line %d in %s:\n",/ i a1 w s7 }4 ~& Y% Q
irc, line, file);7 v3 b9 W% I) I
ECHO("+++ %s\n", err);. V' O& R9 d/ m% C4 y1 _5 z
ECHO("%s;\n", call);, P3 Q6 ]6 u7 _7 J
}
' T& J3 j8 S( g
8 Q) s, y% A6 F O3 `1 V# I return(irc);
/ J5 M) _9 k3 k% |5 |}) w! E+ R; v3 p" W5 I
$ t9 U; `& `; h. m7 b#include <NXOpen/Session.hxx>
( ?# A4 N( Z9 z#include <NXOpen/Part.hxx>
( s& n; f, s P( B. n1 x7 c1 C. e#include <NXOpen/ParTCollection.hxx>
- ?% n/ [- M# j1 t! C3 a#include <NXOpen/Callback.hxx>! t0 O: e+ ]& t" b0 G6 B* @. i) j6 P" q
#include <NXOpen/NXException.hxx>/ S. K/ e0 \5 [& W
#include <NXOpen/UI.hxx>: T- t. }( o8 l& l9 @# P# g O/ G
#include <NXOpen/Selection.hxx>" I. ]5 n' m9 L2 {& E
#include <NXOpen/LogFile.hxx>
0 I( v0 n. g) {9 `#include <NXOpen/NXObjectManager.hxx>
. F3 o8 C/ }0 p: W* O) V7 Y#include <NXOpen/ListingWindow.hxx>
/ d$ k3 H& O' X#include <NXOpen/View.hxx>
; F: Y! s0 r: G& e* A1 I/ `. N
! @( x0 g0 D5 ~, ^" F$ S- `; F, i3 {#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>, k2 B1 c: p. W0 d% p, m
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>, w, m& e- j7 g) t* i9 e
#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>3 I% Q) s4 n* E) c: L
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>& t& M% N+ `4 l z9 ?
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>
, @8 `5 k6 O2 w6 r& a. Q#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>4 v) T2 A: I0 O6 X" d+ H
#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>
: u) ^0 i: Y+ W3 L/ ~1 l( ?' D#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>5 n6 @/ @9 Q* m! s: h/ S
1 w. e6 u* M3 I" i2 i2 L
using namespace NXOpen;
/ }4 E) x) v1 p& k* f8 K; qusing namespace NXOpen::UserDefinedObjects;
( Z& A* N( s f) q/ b: K
1 z6 t) l3 p. ?3 H4 q//static variables
8 ^2 ^% f5 J1 m$ _static NXOpen::Session* theSession = NULL;
! w# a( Z, S' `+ I2 w7 d6 istatic UI* theUI = NULL;
, m) U, U! V0 b6 v2 J6 tstatic UserDefinedClass* myUDOclass = NULL;
1 f* \2 I. y% z f
0 ?" {0 I5 v/ F. |//------------------------------------------------------------------------------" E3 e0 C1 I- s, d6 R" z) P n
// Callback Name: myDisplayCB/ G$ r( I* ?5 {! [+ C: Q9 r
// This is a callback method associated with displaying a UDO.
! o4 H/ z4 Q3 c) b0 u+ _// This same callback is registered for display, select, fit, and attention point
$ \* I6 Z2 x5 u6 a f" T% [ m) T//------------------------------------------------------------------------------
) U, e9 m9 ^. Y$ |( @: O( U, d3 J2 Iextern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
. |9 y8 W7 c) J8 d, m( q2 F{
0 t' ^% z6 |) w+ ^; m w8 ? try
+ h s& [5 Z \ {
/ F) L [+ B- D ~ // Get the doubles used to define the selected screen position for this UDO." f( I0 N( z. N! {" W+ C
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
' S! r5 @% E% B% _0 g$ I: }) u1 A8 k: V( P0 q
// Use the doubles to define points of a triangle
( v0 G" ]- ^" t9 D( z8 O8 \ std::vector<Point3d> myPoints(4);) U; k0 Y: I- _$ a; H+ @) ^: e
5 y% W! M9 b. k: ~7 Z+ K$ X% q; z
myPoints[0].X = myUDOdoubles[0] + 0;
* r2 h0 E; X' C) s% N myPoints[0].Y = myUDOdoubles[1] + 0;7 }* ~9 ], R* w5 j& d
myPoints[0].Z = myUDOdoubles[2] + 0;0 W; I' H1 g1 m R
5 n6 b# N3 E+ Q+ l$ a: p. u
myPoints[1].X = myUDOdoubles[0] + 100;- N: b, g2 I6 e! ^5 N
myPoints[1].Y = myUDOdoubles[1] + 0;6 Q; ? [' @, L/ B$ z8 v/ X
myPoints[1].Z = myUDOdoubles[2] + 0;
6 a; ^5 ]* Z& L
/ ]7 L' z) Z$ h4 ]8 O myPoints[2].X = myUDOdoubles[0] + 0;
& I& j. N) G6 ]; f- } myPoints[2].Y = myUDOdoubles[1] + 100;& |5 b, q' t1 @) g# E
myPoints[2].Z = myUDOdoubles[2] + 0;! H G( i0 U; u, B% b& t7 `# ]2 m
# @5 c. |' X4 T
myPoints[3].X = myUDOdoubles[0] + 0;) ~$ u+ u+ e8 o& p, b7 p' C @
myPoints[3].Y = myUDOdoubles[1] + 0;" f6 Z0 E5 }2 H c) S! X! J/ |
myPoints[3].Z = myUDOdoubles[2] + 0;5 q3 n ?4 J4 o
4 G& [' y) C1 ]% ?$ m5 V6 I# R
// Display the triangle
( c* M$ W- H5 a$ o$ ^+ E: l$ m displayEvent->DisplayContext()->DisplayPolyline(myPoints);. ^) o7 c4 x+ K6 B& }/ X, V; R
8 a) R4 o! U! v3 u1 Q# x
// Display the text next to the triangle
* B+ x; m" S2 m; l Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);
8 S: x" h2 F3 I- ^" x# C0 N' } displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);
. N1 l) z7 h' K0 I% m4 e8 T: F9 t/ c' n7 S) k5 _
// UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
9 F8 \: n z+ P6 _$ S7 A+ A // This demonstrates using UF_DISP_display_facets as a work around O7 R& J Y" a, a/ T
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };0 l4 }8 J# m1 {& M+ ~
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],2 M$ Y" J% ~ q7 f' p" `
myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],( `+ {* ^$ ]0 }+ P0 R7 Y, }
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };
' c9 X0 N( @( B! V UF_DISP_facet_t facets[1] = { vertices, normals };6 I9 l! {+ U- u' ?
void *context = displayEvent->DisplayContext()->GetHandle();
# n. A2 C. @% A3 ]) v
: n" ~, C( b, q) D# s9 [! \5 J1 s; Q UF_initialize();9 W1 X' G! S# c
UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
3 k# R7 H8 o4 c) ?9 h) }. ^! _7 ?9 s; e UF_terminate();$ i$ {6 d( E1 g* c
! Y: q% y9 N, |- X' U4 L# ]$ T. k
}
& h h, C3 G1 J" J catch (NXException ex)% _, @* r+ A% f6 T+ C/ c& c0 I
{
- s, O* x( r) o ECHO("CaUGht exception: %s\n", ex.Message());
) a9 Q' [& \: s& p }- u. _+ i3 S* n! J8 U1 m
return 0;
" _ u6 U( ? H# ~}
! g0 D2 f Q% q6 T5 _' |- F//------------------------------------------------------------------------------
' f) s/ I/ a7 z2 e2 f5 |// Callback Name: myEditCB
- Q. A, l9 u, g; s W: @// This is a callback method associated with editing a UDO.
! `& ^, | ^/ n8 ?" _//------------------------------------------------------------------------------" _% J- \) p0 }4 C5 \5 l0 B
extern int myEditCB(UserDefinedEvent* editEvent)
9 G/ ~( l% l1 y0 {{( C2 N7 e" g; z* D6 z- O% U$ |
try3 L. v& V1 C% b1 l: X/ R2 J
{
" Z `& x% i3 A$ P // required for calls to legacy UF routines6 x# G F: t( g5 N n/ V6 K" M
// such as UF_DISP_add_item_to_display
v; |" j% D0 d UF_initialize();0 w+ a8 f) z: ^: }7 `
0 P: _- J" K2 | V5 Z. s! Y0 M View* myView = NULL;3 x' ^* U( ]2 {( [( c8 M8 R
Point3d myCursor(0,0,0);
4 V- x" Y: Y- `! E; D1 P' Q7 X; G2 k
// highlight the current udo we are about to edit
" W# p( ^& Y9 G% | // this is helpful if multiple udo's were on the selection
! K& ]6 j: Y% n- G# J# z9 M4 r // list when the user decided to edit them) A& Q- V& G/ m: `% Q
editEvent->UserDefinedObject()->Highlight();: c: ^9 I' R. U, O
" g, v" S3 D# ?" ` // ask the user to select a new origin for this UDO: h/ u- o3 ^* v& U
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);" W' Q" ^& Y) r2 ~: r
// we are done asking the user for input... unhighlight the udo$ J, {5 k* X1 t- l
editEvent->UserDefinedObject()->Unhighlight();- y ^. C" w! B- X
4 M: V; L% l- X2 D0 u // use the new screen position (if the user picked one)
' n7 T( Z f" ~7 c4 l if( myResponse == Selection::DialogResponsePick )( l$ e( [4 W6 T* M
{4 t$ K4 s7 K% [1 z5 y5 v
std::vector<double> myUDOdoubles(3);5 W( H8 Z" A/ c& v1 @
myUDOdoubles[0] = myCursor.X;
# y: w3 c! o; s' P myUDOdoubles[1] = myCursor.Y;" c# ^' [, f" T0 N4 X
myUDOdoubles[2] = myCursor.Z;
% a( W+ T' r3 M // store the newly selected origin with the udo/ F/ Z0 a) ?& c, r
editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
( r) [ O, R: u$ O$ V* R // add the udo to the display list manually
9 V* ~% P( L7 F+ @& k% ~( V // this will force the udo display to regenerate! a5 r g2 J. j
// immediately and show the changes we just made3 t7 v& y" |2 W$ B
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());
" a Y% e% g9 X' u3 r L/ U }
9 B* ?* j. t' Y' L* I7 h& K UF_terminate();- k% G' k% |$ b: Z
} catch (NXException ex)
- o( n% }/ q6 o( O {; [2 m1 H* K! [* j+ V3 f
ECHO("Caught exception: %s\n", ex.Message());" S5 ^" ?1 F K! |& E$ z$ u% j
} return 0;( m2 Z( Q0 z; m4 \# y* W3 n
}# Z/ z2 ^* E/ u- l0 R
//------------------------------------------------------------------------------1 i e V7 I0 Q' \1 _
// Callback Name: myInfoCB
+ V- H* |: E& Z! W3 u: o# o// This is a callback method associated with querying information for a UDO.
, O- [% ]" j; f// The information is printed in the listing window.
+ h, G: A- p( d//------------------------------------------------------------------------------
. F9 n( x% C/ Y1 g7 z/ u2 c# E _extern int myInfoCB(UserDefinedEvent* infoEvent)
3 E7 {& ^ @ A) h; n{
6 v+ e c# }0 M: [. E$ z4 S4 S8 L' H try
* u8 z" Z2 C* B( ? D3 |; w6 ^ {. c ?8 [% K) z9 r- z' Z
ListingWindow* theLW = theSession->ListingWindow();9 |# T! Y4 _2 H- A! j
char msg[256];& L' ^+ E7 p; r) Z7 j
theLW->Open();
7 Q+ `, ^1 H. `, s& p$ i4 w0 m8 W theLW->WriteLine(" ");
2 g2 d# N8 W) ^2 |: G# c* s theLW->WriteLine("------------------------------------------------------------");
; l& R( i/ o4 | theLW->WriteLine("Begin Custom Information");
( O; e) ]" a, x, B" K$ v theLW->WriteLine(" ");
1 }5 _2 f9 K' h; I5 @6 ] sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );3 P/ }/ \9 Z9 x0 ?# G3 O( W; e% \
theLW->WriteLine(msg);
- a. \% T# h2 o5 V" O sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
" P, m3 q! ]7 {0 p theLW->WriteLine(msg);
8 t0 a P. p4 _7 s' B std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
* U5 X; j0 Z% @3 \& Z8 M. {; Y sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
/ B$ V( { u* t' S, i, ? theLW->WriteLine(msg);- ] P" k# `: u; X7 t- d
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );
4 N9 J7 b) k: ^, @( T theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );4 S) ^$ [% L! C0 C% b
theLW->WriteLine(msg);
( C. O }( p2 @( A theLW->WriteLine(" ");8 Q6 T7 Z4 s" y/ l A
theLW->WriteLine("End Custom Information");! o( C" Y! D) B1 K/ c! g& G/ }3 ]3 X
}
( Y5 d' M) v1 T# U9 J) J. ^ catch (NXException ex)& Z; U0 @; |1 E
{
, Q* O" n: F6 w. K8 a ECHO("Caught exception: %s\n", ex.Message());
" X b: y3 u% o1 P1 [ }
' }2 V" F2 T) X) t/ T return 0;0 B: k+ z) c% T }( ^2 }9 w3 @5 K1 W
}
1 S& ?8 n5 `$ H4 J* @0 L
$ `1 e. q: ^: X( w: I% t& _- p//------------------------------------------------------------------------------& T8 f' Z5 l4 j/ |- g; D
// initUDO; M' \. C/ m/ N) A9 t) t9 O" q. h
// Checks to see which (if any) of the application's static variables are+ S" k7 A7 o3 X3 ~
// uninitialized, and sets them accordingly.
O( Z" b! B. s# @$ F// Initializes the UDO class and registers all of its callback methods.
' w4 Q! F; e9 V% u. C//------------------------------------------------------------------------------* P& ` \* {" [3 i
static int initUDO( bool alertUser)# Q; N7 i' [6 o a
{6 `, {& K- L- _" n" E
try
) p/ F) Q& ]8 M+ N {
+ f% i' u9 m* M! N$ t# z3 S+ G z% d if (theSession == NULL)' g5 f7 T9 S6 g" F% ?. {
{" w1 F- {( d( \1 r' v8 |
theSession = Session::GetSession();- b* E: e6 i# A+ F ^3 m
}) Q% E5 K% {) \
if( theUI == NULL )
5 x7 G! J- _) \) o {
( r* T$ _; Z, z2 n) O2 t0 X1 K theUI = UI::GetUI();7 F% o% O5 {/ W0 R& R+ y: ^
}
) s. P1 m/ N) @( X8 g- G/ w if (myUDOclass == NULL)/ X5 V# d5 p( f- N9 Y# W- O% e# b2 S4 \% H
{3 l7 f6 N. @- @2 z$ N( V
if (alertUser)
: |/ A/ ], R1 L( l. O- q: n {
3 X9 s& m. w# c8 `# U( L6 Z ListingWindow*
; p3 x! r8 E/ B5 u. i theLW = theSession->ListingWindow();
( q5 z' ?2 ^# n2 [9 l* A% i theLW->Open();
" W6 Q4 R4 ]& R" |9 _( v theLW->WriteLine("Registering C++ UDO Class");
* M& F9 N) f' M9 I" O8 Q% I+ u }
* r: ]3 b$ Q! g! b& o // Define your custom UDO class1 e3 ?. K6 m4 u
myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");# x5 v' G- f! ^2 t) ~- j7 k, p
// Setup properties on the custom UDO class# k4 l% M" o: B) x2 C
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);. O) n5 K0 b3 A
// Register callbacks for the UDO class: A) }. N( I6 b6 U, u* U# e
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
# D5 v" M9 c+ T4 p myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));
2 u& [2 `0 c; X+ z myUDOclass->AddFitHandler(make_callback(&myDisplayCB));
1 x0 ]8 I9 h0 U( D4 G; q myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));' `1 m9 J5 P7 T" N6 @9 a
myUDOclass->AddEditHandler(make_callback(&myEditCB));) G" t& D0 C3 m" v1 Y
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));) g7 R" K/ ]- M: W( s
// Add this class to the list of object types available for selection in NX.
2 s& M; c6 g) Q/ _& u // If you skip this step you won't be able to select UDO's of this class,
5 |& S: D- ~) r2 Z% ~ // even though you registered a selection callback.% l+ }1 M! _$ J1 y
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
( t+ w0 L9 r! s2 x' S5 A4 s0 P }8 v! n# n/ _7 t) G; {
}
+ j4 s3 h4 Y' i f3 ?! H; c$ F catch (NXException ex)
2 X5 R8 p+ |( M. Y8 C {; s0 y0 v! V0 z0 @: v
ECHO("Caught exception: %s\n", ex.Message()); x8 \ d& J1 _2 q
}' N% z7 h/ e: p1 {. d9 L( @
return 0;+ ]# @% d* j5 Y2 a" L, C
}4 W d6 j2 W+ n! y' i
$ m, B3 C' O' ?
//------------------------------------------------------------------------------/ U" P! p8 _0 P Z1 x% M5 t
// ufusr (Explicit Activation)/ `0 h$ j- Y3 l7 z% b
// This entry point is used to activate the application explicitly, as in4 \5 f4 Z/ v! H3 Y8 D
// "File->Execute UG/Open->NX Open..."0 V; k+ N7 L- o5 S+ Z7 G
//------------------------------------------------------------------------------, y* Q0 ^9 e# a7 L& N
extern void ufusr( char *parm, int *returnCode, int rlen )0 ?( U$ L4 P @$ ~/ S i1 c
{4 g8 U( H$ c5 ~* Y2 w
try
# R# \' q z, q5 ? {3 {3 C8 a- n' j" H* f
// required for calls to legacy UF routines
9 V9 f$ z, {; ~" Y+ V+ [, \' C' N // such as UF_DISP_add_item_to_display2 F) Y6 B. m. U- z) L: ?5 _
UF_initialize();+ L5 l2 }0 q" ^! N. D5 n P
9 T* d2 g$ n- a# e; k# x9 i // initialize the UDO - if we didn't load this library at
$ h: Y. V5 d6 x; |9 r/ K // startup, here is our second chance to load it) r2 u+ }+ f: w# r: R [
initUDO(true);0 E/ g) `' [8 \) w
z8 c8 y0 ]$ N- D6 J* l3 Q // if we don't have any parts open create one* O2 x* ~2 _9 q1 u
BasePart* myBasePart = theSession->Parts()->BaseDisplay();
! x1 Q* I3 k, {9 _1 B if( myBasePart == NULL)
9 c& }' F4 l) Z/ A/ ~; o% X {1 R& a$ J! Y. S& z0 R3 Y! O( k2 w, a
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
( m$ g, [+ P# ?8 h! O3 g5 r, K# n }+ J1 D7 n: n1 d* c9 X5 C/ \
& R' y3 y7 L! i& |5 P9 f
View* myView = NULL;
0 _' t$ k6 n2 c" J# C6 B* } Point3d myCursor(0,0,0);
7 f. O& t6 v& G/ S% G* I. p0 f' U0 [! L5 m
// ask the user to select an origin for this UDO2 B& b I" y. t; i9 f8 F& A
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
3 H; ]9 i( L m; M: b5 [ if( myResponse == Selection::DialogResponsePick )1 A) h6 F% b5 i
{
0 A+ i: }$ ~/ E" v) c6 i6 u // The user selected a point - go ahead and create the udo
& _; F, Y1 X2 Q5 w [* r( T UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();/ f% j0 C. e' D9 o( |' V% r8 Y
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);+ S8 s- E8 {- k! g1 y* o) ?6 \: I
// set the color property of the udo - just for fun :)
7 l% a8 A" G/ d7 R firstUDO->SetColor(36);
! W2 m' c6 O0 d1 R9 j! i6 l // store the origin selected by the user with the udo7 p e; c* w, P3 Q% e
std::vector<double> myUDOdoubles(3);3 V( d! }9 A F9 c6 a f* {
myUDOdoubles[0] = myCursor.X;
; T1 T9 i! {5 f+ c myUDOdoubles[1] = myCursor.Y;
: i/ s0 T) {( B2 x myUDOdoubles[2] = myCursor.Z;, Q! N7 l7 \6 j! P5 b
firstUDO->SetDoubles(myUDOdoubles);& B2 o: J X! n, ^2 W" \; J
// add the udo to the display list manually9 b% p6 @* P4 H
// this will force the udo to display immediately
7 K' h2 |% p% g+ u1 P1 U$ r" P UF_DISP_add_item_to_display(firstUDO->GetTag());( F0 N/ v: b7 [0 E# |, G
}
9 M+ m) L1 k) \& U" | UF_terminate();) M2 D3 C' k+ C
}
# g/ y4 C) N2 S; d0 |0 }' R& O catch (const NXOpen::NXException& ex); s% n, \) G' I+ U
{1 U' a; V2 M% u: l3 E3 y
ECHO("Caught exception: %s\n", ex.Message());
; Y% }$ H( p0 L4 D }
- V& l# u+ x7 a7 U [ D}9 g; _, u0 j+ a7 f
% S; X5 j6 F& p% |//------------------------------------------------------------------------------
9 x- A/ f$ L0 p& T// ufsta
: C, C: C/ z7 e: t/ _) p, k// Entrypoint used when program is loaded automatically( [& g. ~& W; y' _0 ?( t. b
// as NX starts up. Note this application must be placed in a: x) t0 U0 @* O# H4 i
// special folder for NX to find and load it during startup.' G6 B8 H2 Y* w0 ~
// Refer to the NX Open documentation for more details on how+ S. J4 B3 P3 N' M# m2 j
// NX finds and loads applications during startup.
& F" K7 t& p% n! |//------------------------------------------------------------------------------2 C+ J3 v! \* K: `: {
extern void ufsta( char *param, int *returnCode, int rlen )
2 k! _' l3 U+ ]5 X3 \: v{
: f& r* `, e, X& d try
: t5 E8 B D8 H8 c' N+ ] {7 L: w( w, O& W- t0 U7 V U
initUDO(false);
2 Q; F0 ?& S# \ }
0 y2 `& \2 |$ K$ s8 N, J catch (const NXOpen::NXException& ex)
) t3 L5 [: {, P& {. r0 m {! c! F0 F8 Y0 B# q
ECHO("Caught exception: %s\n", ex.Message());# O8 A4 X7 v) Y6 R4 a2 j$ `+ r
}) v0 f3 ?* N! [+ P- R% ]$ r2 p$ [
}
B( Y, E6 l% _- S& C: ^: T& j& @& z
8 o3 B( E) W' T* v! ]//------------------------------------------------------------------------------" B. }: B% p( j
// ufusr_ask_unload; e2 ^, F1 e- ^: x" W
// Make sure you specify AtTermination for the unload option.
/ M' O; N% `1 y# s' X3 n// If you unload the library before the NX Session Terminates4 [# [9 s; p# l- b x' w7 j& l
// bad things could happen when we try to execute a udo" n# r" R6 F F. k y3 D7 U8 I/ v
// callback that no longer exists in the session.
$ S+ `% @! Z7 v' X; v+ W//------------------------------------------------------------------------------2 o: t3 e7 D$ o6 i @8 N# i
extern int ufusr_ask_unload( void )
: h( ^: E' f# S( Y; e/ U% u, N; J* u5 w{' M3 N3 T# l' Q' ]
return (int)Session::LibraryUnloadOptionAtTermination;
, C* L& h' x! {' w}
" x4 `; I) d- j% z& u
2 ~: d' ^: w9 j |
|