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