|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
@. Z; C8 K; o) s9 q1 q1 u) F/ n+ o2 z- B, e
NX二次开发源码分享:NXOpen C++创建UDO的过程7 I, |! E ~8 f" C# }
/ b, ~ j {+ X9 O) n, J h1 B" }" h3 C" [4 `. B% `, L
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
0 L7 {$ o& F$ I! `: _
+ Q! [9 g+ t% @6 S- ^+ F$ [4 h7 n4 P$ \
, j. g2 u) h5 g3 H1 g% f
#include <stdio.h>
1 q" O: J9 ?8 t- M9 E. `# o#include <string.h>
2 ?) O0 A. q# {2 G5 U2 L#include <stdarg.h>
/ a, R; F6 |# k) ]. X3 F#include <uf.h>
: B, P6 \# p; O' W6 u#include <uf_ui.h>
1 [# X+ k; K) r% ?% X H6 n, J#include <uf_exit.h>* M0 \6 U8 w# Q4 `0 j
#include <uf_disp.h>/ V. {& j( Q0 P9 O
7 {. d2 w5 p% G2 ]* [: wstatic void ECHO(char *format, ...)( I3 {; V" y4 }+ I u C
{0 W* ]' I3 c5 m0 w X3 S
char msg[UF_UI_MAX_STRING_LEN+1];
( Z! d8 K/ G7 u va_list args;( N6 Z& U: C$ | n
va_start(args, format);# r3 l% b7 e- C1 y% T& a
vsprintf(msg, format, args);1 n6 F9 @/ {+ c2 j' g
va_end(args);" {, d) r" U c8 H& k
UF_UI_open_listing_window();
. p( }% w1 T" ~/ h3 ~' p UF_UI_write_listing_window(msg);
D* B7 W& V. U$ x+ k/ c& ~2 C UF_print_syslog(msg, FALSE);2 M* F# y; G. @2 ? G" K( |# ^. a2 F
}% }- y- g2 H8 |2 q
) ?6 I8 {8 m' j6 s
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))' h4 r4 v, T7 a7 z. O
+ e2 o2 T) s, w5 }static int report_error( char *file, int line, char *call, int irc)
. @: O* J B- s0 Y& y{
& V0 C! j+ t0 H3 s% L* x+ x: Q if (irc)
) r% `/ U/ ?1 _3 X+ S, ?$ U {
7 V7 t/ I6 u$ Z( k8 W8 P1 `* M3 q char err[133];
/ {- w6 X" Y+ \% t1 `1 v7 u& J
! u2 U6 W' o+ O/ f: O9 E" x UF_get_fail_message(irc, err);2 V" r0 h8 K. Q' z6 y# F
ECHO("*** ERROR code %d at line %d in %s:\n",
* m/ b! o4 `' B% }+ q irc, line, file); k" z3 Y7 x+ c h8 N1 X* E
ECHO("+++ %s\n", err);
/ k" m0 R! W3 D0 V9 d) {/ c ECHO("%s;\n", call);$ \: a4 o/ u4 C/ X
}+ h5 K: d4 N" W) Z- ?5 t
& N# m' [, o* N! W return(irc);
* R+ N4 E. h. N$ }" O}6 X8 ]! h a( y
( l! t. y% U) I- }# b1 Q- C9 ^
#include <NXOpen/Session.hxx>
7 Z& @ o7 Q E#include <NXOpen/Part.hxx>
5 u* [) r( p! J#include <NXOpen/ParTCollection.hxx>
9 j b. }+ |# {* U; W7 l#include <NXOpen/Callback.hxx>4 r0 `$ C. i p' @
#include <NXOpen/NXException.hxx>
# U0 O: ]1 O7 _1 J* ^" L#include <NXOpen/UI.hxx>: ~6 w$ u2 _% S" G8 b- t2 w a1 ~8 U, {
#include <NXOpen/Selection.hxx>' W+ k( m. r N- a0 R i
#include <NXOpen/LogFile.hxx>0 M6 C' z) [, H' r6 n
#include <NXOpen/NXObjectManager.hxx>% O. J( N, K$ t
#include <NXOpen/ListingWindow.hxx>8 t. n4 u0 z, t
#include <NXOpen/View.hxx>2 @% M- P G; z X0 r
1 R2 A- I' H0 j( Z6 f: r4 p& X
#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>5 U _: Z- X @/ ~
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>0 j+ |3 A: d$ S& G/ r- Z
#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>0 {& Z" s$ A# G/ O3 J+ M/ B! {# T
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>
$ Y, c% Q, m- H( t#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx> D. k3 u9 p* Y# o( V
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>7 D+ e) \1 k* N
#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>9 w& F7 F* {+ s) z4 q
#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>: H# n/ p( d: f x+ ]# m0 ?: T: K
, o& b; Z7 o7 V T: l( I; e" E
using namespace NXOpen;2 \/ I! n8 A8 _9 V1 n4 G1 x
using namespace NXOpen::UserDefinedObjects;$ l% r7 p, Q& f- @" n1 }9 X$ l
, k/ `( |2 H9 W7 l4 ~//static variables
* k" @. \2 f8 X5 G; |! mstatic NXOpen::Session* theSession = NULL;
5 F8 Y# A- }; m5 {/ `8 @static UI* theUI = NULL;1 x( x* D: [; u2 G1 [: p/ F! U
static UserDefinedClass* myUDOclass = NULL; ?/ w! Z* F' X' r$ V3 k
8 `; A! M n. w//------------------------------------------------------------------------------# \8 t* K; ]" N0 e
// Callback Name: myDisplayCB S, E( I3 ^/ c
// This is a callback method associated with displaying a UDO.1 O% b! x" D5 y
// This same callback is registered for display, select, fit, and attention point
3 y8 t! [; v- C( K/ m. Y! @) f0 V//------------------------------------------------------------------------------$ s2 J X; C* V+ f3 j- l
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
' _, x, r/ p7 N; @8 R{
* Z8 U. m: x8 U/ @/ R0 f: N$ a' v try4 V F; d+ F _4 c7 H: u
{5 s) w' ^( K6 g, U, e: D
// Get the doubles used to define the selected screen position for this UDO.
7 r7 h( c4 L3 k- x0 O std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
5 ?6 U9 n7 I$ r, e: s+ S; F9 {! Q- {# ~: a
// Use the doubles to define points of a triangle- ]6 ~% O% Q9 c W3 @ E8 y
std::vector<Point3d> myPoints(4);2 R- ~- v+ B" ]% p
. M j2 V% i. Z) h4 n! `; C
myPoints[0].X = myUDOdoubles[0] + 0;
) l5 s1 Z: R. X& h myPoints[0].Y = myUDOdoubles[1] + 0;* K! T, e7 A o6 E& v$ ~
myPoints[0].Z = myUDOdoubles[2] + 0;1 ?- ^5 \: I5 g0 N
1 T0 @; [# X) y3 m$ i; D& A
myPoints[1].X = myUDOdoubles[0] + 100;
( r5 R$ L; s5 J# O myPoints[1].Y = myUDOdoubles[1] + 0;
: S: f% f- N* U* h" z5 _* f$ q4 F myPoints[1].Z = myUDOdoubles[2] + 0;/ J* ~: s8 m' h2 |
$ Q2 y0 h7 `- G% {: \% S myPoints[2].X = myUDOdoubles[0] + 0;- h' T3 _3 ~ h, t4 P, b
myPoints[2].Y = myUDOdoubles[1] + 100;& u$ `1 l5 B# ~
myPoints[2].Z = myUDOdoubles[2] + 0;
) p+ c! i+ l3 o8 N2 k
. k1 Q5 a2 _& w4 g. N myPoints[3].X = myUDOdoubles[0] + 0;
% {& w' S: m8 Z; B3 a& i3 U myPoints[3].Y = myUDOdoubles[1] + 0;2 E0 T% }% K* x5 [! a$ _
myPoints[3].Z = myUDOdoubles[2] + 0;) F" K( U( R, p' Q" }* @- N
% W7 `6 k+ k+ S, k* g2 y
// Display the triangle l/ X3 z3 L; }$ t" c. D
displayEvent->DisplayContext()->DisplayPolyline(myPoints);
; _# ~4 ^7 I7 A, y' B& u
8 m4 `$ A1 X; p, j! R6 s: u* @ // Display the text next to the triangle4 D3 ?4 b% S, u8 Z) D
Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);; U( b7 e8 e% B, g0 ~" Z9 A8 M
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);" J0 r$ c: O- g9 q* S- V
0 ?/ d& N1 w J3 H; y( H // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
, y( u, t- X! d, a) ]7 d // This demonstrates using UF_DISP_display_facets as a work around
9 J$ n( y) C, {1 z# X double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };0 F4 }, c, S& y! h8 J4 R
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],8 n/ r! F E% z" x" P; r+ n+ M2 z
myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],5 @" m! q6 |' d
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };
/ I1 K' H) J& g3 n UF_DISP_facet_t facets[1] = { vertices, normals }; C. b6 w; f. h8 f7 J, z
void *context = displayEvent->DisplayContext()->GetHandle();
; }7 |7 M3 K* t6 f+ ]: }! e
* \5 m" {% W5 w+ |5 k c8 ?/ [ UF_initialize();
' C( C4 K) x3 v UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
; j0 j: `0 y9 ^9 a. P UF_terminate();
# T; O, {6 I# e& I# E- ?& e' @( Y' q n5 @* G
}
$ ~0 V/ N9 X& \; D catch (NXException ex)
6 u8 Z; F4 g& z+ r {0 `" q7 z8 o; N# p; a, a
ECHO("CaUGht exception: %s\n", ex.Message());6 `( C3 t0 L8 l
}% m- U$ q) z; [$ n/ R9 D% J
return 0;
4 P1 w# s m" X: d9 N q}
2 T5 N3 k' F1 D6 a: U9 a1 E! `" o//------------------------------------------------------------------------------
) R5 B+ `+ f* B* j// Callback Name: myEditCB2 I" h- W4 r z4 V A# l
// This is a callback method associated with editing a UDO.
- B8 @ T' F# S$ {! {' B8 x! r6 J//------------------------------------------------------------------------------% s3 k* Q. E! h' X
extern int myEditCB(UserDefinedEvent* editEvent)4 ^: u% ?) L. k, Q' T
{2 W* ?; J$ I9 \% a; n
try
( |. ]. i0 k& F' e0 u {# d( ~$ g! G* I+ W# Y- _' D, l- m
// required for calls to legacy UF routines$ q: v3 x5 W3 C7 A/ T* K
// such as UF_DISP_add_item_to_display
3 ~* I1 t$ ? u# w9 A- D2 j2 ~ UF_initialize();
( ^& q, n' Z( C2 x1 E* V
$ P6 D# M8 N5 O8 @( O Q m View* myView = NULL;
" t! c1 t" n/ b& J6 X* h Point3d myCursor(0,0,0);0 W. p' i) Q, p1 {8 _) z( r
c' b" k* J& R4 r3 W+ L4 n, W0 ^3 r3 X // highlight the current udo we are about to edit
+ q% A& v/ y1 r/ ~6 o( S // this is helpful if multiple udo's were on the selection: |- e5 X/ o4 @8 m' R
// list when the user decided to edit them
5 _$ q" ~2 @! l# o+ b ` editEvent->UserDefinedObject()->Highlight();/ L9 i6 E! K+ S, J4 p& j9 v
4 s$ Z q! A, b# A$ g4 h/ m: i
// ask the user to select a new origin for this UDO
4 g% K2 Z; n4 i Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);% [+ T$ Y G: N9 |$ B
// we are done asking the user for input... unhighlight the udo
! Y/ _& u+ _; ~7 ~* q+ x editEvent->UserDefinedObject()->Unhighlight();1 v5 g! h* a6 u/ D
G- L$ y6 y. d/ s0 _- c1 ?8 Z5 F
// use the new screen position (if the user picked one)
2 @ r0 n7 h5 i$ N) N if( myResponse == Selection::DialogResponsePick )* ^3 t; s+ v* u4 U
{
$ `4 \" A; L: Z& n h: ?. }3 [ std::vector<double> myUDOdoubles(3);8 `9 j8 a1 W | O
myUDOdoubles[0] = myCursor.X;
& a# Q, [7 }0 X# ^! K* S& f5 U6 F* a( G myUDOdoubles[1] = myCursor.Y;* q% v: w/ N* Q
myUDOdoubles[2] = myCursor.Z;
& v' \8 T: W! s( W% J: c // store the newly selected origin with the udo
6 F! G6 Q8 @' K1 P% }' Y2 `, N: c editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
1 r7 c2 b, n! U, X* Y // add the udo to the display list manually& ?( d5 {( ?% t- \# P; A
// this will force the udo display to regenerate X( x" h& s1 n3 J
// immediately and show the changes we just made7 Y* P! o0 m O6 {5 k! W
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());0 s& T# |) L9 s1 Q# Y) T
}
( |* d6 J3 z$ F6 c' j" @ UF_terminate();
: T' h7 ^' @2 N- @$ W: V } catch (NXException ex)
. R: |; U* U: Q/ l7 r; s {6 \3 v7 Q, S& b6 s+ C& E" }1 J
ECHO("Caught exception: %s\n", ex.Message());
" [4 Q' S0 K2 m9 n } return 0;
8 S" ~0 g& C3 D$ j& U* H}$ o% n5 _( x6 i. [9 U3 Z# F6 B
//------------------------------------------------------------------------------
, M* g. B4 u8 Q// Callback Name: myInfoCB4 u8 _0 |6 w0 P0 e9 l, P) d
// This is a callback method associated with querying information for a UDO.
. @ O: s: y+ O+ {# [! ^3 _// The information is printed in the listing window.
, e! X( s( [1 z+ a8 l# s" a//------------------------------------------------------------------------------
1 U) Z( H* Y) [5 [1 O: kextern int myInfoCB(UserDefinedEvent* infoEvent) e! J7 S+ s/ E. f. v4 K0 ~0 k4 e
{
" m" b" A P, \6 Y6 h try
/ Z1 n( A D" w6 E: J+ ^/ J2 |8 L: x {* ^: X8 U" w- f" u2 N9 d" T
ListingWindow* theLW = theSession->ListingWindow();
' D6 i L7 P7 O0 g char msg[256];
' Y; i* ]# n* B7 l theLW->Open();# f6 |* e; b, x2 v" h
theLW->WriteLine(" ");
# j5 W0 E: f) G% z theLW->WriteLine("------------------------------------------------------------");) ~; v2 ?( O' J5 a; z; h- S
theLW->WriteLine("Begin Custom Information");
9 H/ _: ]; r& t5 S: w0 ]0 u9 k theLW->WriteLine(" ");
0 k6 b O6 T; s* @! P& ~& c sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );0 Y9 M9 h$ T. Q+ K5 X( ^( Q* Z
theLW->WriteLine(msg);
9 V0 B/ G- m) R2 ^. U sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );0 `! D' y6 I! P. j' b! y; t# w
theLW->WriteLine(msg);6 z8 o& W2 v1 R" m5 x0 \
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
0 E" \3 L7 y L% [- N sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );7 H* x* n/ c& s
theLW->WriteLine(msg);; I5 H! h' y0 ^2 N. z
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );- K" o" P$ h# T9 e9 A5 j
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
4 [: y# ?3 m5 e9 { theLW->WriteLine(msg);
% h, R+ ?: D: X6 k! K6 o theLW->WriteLine(" ");
* l( n, o) t& I8 D4 I theLW->WriteLine("End Custom Information");' A- h1 [; C3 j, {& r2 G
}
3 D+ C- V) [& g1 s catch (NXException ex)
3 I+ `* M/ K- p) ]# G" b8 n1 E9 H' X {% @ @. u; U& n4 J9 Q- p$ I& M, H
ECHO("Caught exception: %s\n", ex.Message());0 M l0 v) b; m! H3 o
}/ T* D1 L j+ y6 R+ [. X
return 0;
" ]& F7 O. W- v- i- L}
7 `4 X+ N& H7 X: W* O* B' F; b' w9 i8 Y- `( H0 a$ c. R B, l M5 i, u
//------------------------------------------------------------------------------
2 p) d5 _4 o {2 |0 h7 C# E7 M// initUDO8 @% X3 Z9 K5 B: G3 B* t2 a' y) B
// Checks to see which (if any) of the application's static variables are$ N; Q. [4 ?4 p9 P$ Z6 w! U
// uninitialized, and sets them accordingly.
0 T; r, Z* `. R6 d// Initializes the UDO class and registers all of its callback methods.! i( n3 V* @8 U/ Y& {$ w# p: h
//------------------------------------------------------------------------------
' D1 v: {1 k7 B7 ]static int initUDO( bool alertUser)
r7 w, { ^6 A2 ]6 t5 z{- h6 ?" b( C7 F w4 Z
try
4 J& y& s' M$ a: n {9 g6 R; ~0 ^7 i# ` v D6 g- c# o
if (theSession == NULL)& _8 e$ R0 L; l F1 G
{
+ p: ~. M, M6 _- j$ `# t theSession = Session::GetSession();
7 | l9 _0 ^# U/ R; v/ N% q }- r' U( f# o B; A) v
if( theUI == NULL )
) r) t# e9 U( v5 q3 o {9 [ m, W9 u8 M% U% k3 H! U
theUI = UI::GetUI();4 w. F( r/ g0 x. @ d' j
}
$ [$ `" K8 J1 Q if (myUDOclass == NULL)
' R0 I) I% f% E {
9 S* V! R4 Q7 q" j if (alertUser)1 U! [, X1 |3 X0 |, j5 M
{* ]0 ^6 k% _- c7 e: O# O# k
ListingWindow*
4 R% ~. V& Q' w8 g. T u theLW = theSession->ListingWindow();
! f+ _0 y0 X5 _* r. ^ theLW->Open();2 n. ^- c, ~3 d' L. C
theLW->WriteLine("Registering C++ UDO Class");, I9 j+ `+ p1 m4 f
}" R6 ^# q7 x4 ]* [
// Define your custom UDO class
7 v6 a" K F9 P& r myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");1 V, I$ a4 \- y/ Y5 l8 C
// Setup properties on the custom UDO class3 i" z7 j. ?! ^) B# Z2 i
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);7 H8 P3 J1 V2 x9 c+ k6 y3 U! C
// Register callbacks for the UDO class+ L2 j" O+ | v" V7 D( ]( l* j1 w- x
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
z3 j' N, o; p% Z5 x' a myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));/ k% {3 M2 P) }' r& n, ^
myUDOclass->AddFitHandler(make_callback(&myDisplayCB));5 }# f# k! S0 d9 X [! X7 `: _3 W# X5 l
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));* V/ N, ^4 r, O: G2 X
myUDOclass->AddEditHandler(make_callback(&myEditCB));. P1 A/ ^, l0 o9 x" b8 z2 w
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));
' C; n+ Y: f0 z; p // Add this class to the list of object types available for selection in NX.
* L8 V/ t( _5 ~; y# Q // If you skip this step you won't be able to select UDO's of this class,5 j! a0 Q" `3 X( @. y# H7 e
// even though you registered a selection callback.
: i% ~9 y( ?5 z theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
. d0 z5 L3 V) b* k }9 R9 L/ t! K6 ]. F
}
. [9 a6 p, ^! |+ { catch (NXException ex)4 Z; A8 V, c6 ?+ F# L# Z0 o1 O
{ k( o( j8 i" ^( t2 z" Q1 ?" p2 P1 n
ECHO("Caught exception: %s\n", ex.Message());3 q$ v/ V1 \, m7 z. @( Y
}2 t% s( u2 F k
return 0;. T8 I6 w' v/ x/ C9 j" Y0 b& F
}; G5 Q( e3 R9 G, W
6 }8 e0 y8 [: `+ V2 w
//------------------------------------------------------------------------------% y: N" j$ y4 C- q
// ufusr (Explicit Activation)
2 v9 ?$ `8 I% g0 d) i2 E0 D3 e// This entry point is used to activate the application explicitly, as in! L" o' s7 g5 |& a7 s" G
// "File->Execute UG/Open->NX Open..."
4 U# m" ^1 f% t* b B9 ?//------------------------------------------------------------------------------( s. D2 ]0 ]% z' t+ g8 s9 N0 {
extern void ufusr( char *parm, int *returnCode, int rlen )* t: V# }; N- S4 `% X( ~2 }9 Q
{1 H& X- h- e! g' P! p$ O4 Q) O1 ~) b1 ~, Z
try+ }5 {' I$ s K: f
{
5 ]8 _: Z4 C5 [4 y7 P // required for calls to legacy UF routines& a4 ^3 S; F7 w7 [1 c( E$ X0 f
// such as UF_DISP_add_item_to_display; I6 x' ~+ {6 H, p& v/ A! t# t
UF_initialize();
6 ^4 p! T6 x( y3 g
$ z. S( {9 C( w7 G% _4 m/ C* F // initialize the UDO - if we didn't load this library at
, p; \0 Q% f% d% \. ^3 J // startup, here is our second chance to load it5 w0 X& N; J1 I9 r. _3 `
initUDO(true);/ F. o- g6 {% J! U# p2 P$ a+ Z
+ T7 c! `" \+ R K1 f& V( Q
// if we don't have any parts open create one
9 L: ?9 X- b/ c, p BasePart* myBasePart = theSession->Parts()->BaseDisplay();+ G& h$ i0 j0 U5 ?. J/ ~
if( myBasePart == NULL)
: ~) F' V4 O9 P8 y- E. ]9 h {
4 J z. k0 ]* R/ Y5 y! h3 m myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
0 q" a1 k1 m0 | ]( W }3 X! s/ f' }; ] P% c" h. i1 M" J p( P
" M- O$ F! c2 I3 w; V2 F View* myView = NULL;
7 ?1 `0 A: W$ d& j" [$ }( G Point3d myCursor(0,0,0);
, l- n2 M! ] k$ v* v* r1 Z5 h8 H/ m' K/ N1 N
// ask the user to select an origin for this UDO
9 l6 B: F' w4 y* P- } u: ~" T* W Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
% M. a* Y! _6 @& Y0 w7 f2 X# E4 ~ if( myResponse == Selection::DialogResponsePick )
' k: `1 u7 m& ?9 {' ~* _ {
/ t+ {/ l7 v: H // The user selected a point - go ahead and create the udo
2 |3 e+ _7 E4 f3 i UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();
% [$ M8 m5 P5 x1 y UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);
) N7 z( x- q n+ p" z4 X // set the color property of the udo - just for fun :); e" k: R6 \# z: Z: @
firstUDO->SetColor(36);5 }3 M9 d+ c/ K8 c& Z) p& W; h; @
// store the origin selected by the user with the udo7 l0 J: C8 U( N
std::vector<double> myUDOdoubles(3);
" U8 i0 H9 [2 K8 _ myUDOdoubles[0] = myCursor.X;( x. T- g# M7 L$ {
myUDOdoubles[1] = myCursor.Y;6 e1 y+ N8 k! P% K! M0 T
myUDOdoubles[2] = myCursor.Z;
$ b1 i4 I( K! ^: Z1 g2 ^4 C* q, {: z firstUDO->SetDoubles(myUDOdoubles);
4 d# J. k# z2 _* V$ O- U // add the udo to the display list manually
: X; v( J2 a) O7 P: b( r$ q // this will force the udo to display immediately6 ]8 c; C' J( W2 _6 ]/ i0 f8 S+ F
UF_DISP_add_item_to_display(firstUDO->GetTag());& q6 D& q5 h* l$ E
}! h- R8 D- A! m: H' O8 y, x/ r
UF_terminate();+ S# h9 `! G4 g+ x; [
}2 Z6 K1 r/ F* W
catch (const NXOpen::NXException& ex)
3 T' F2 |) f9 G' O; t {5 Y7 b- `. S; A/ k- J9 a
ECHO("Caught exception: %s\n", ex.Message());; }% q2 j: Y4 l Z. o; a% u
}
) n# A* g& z4 C- V/ X8 X8 S( G2 k% M}
4 m/ u6 k& l$ r! `6 Z. y! I0 D, ~" `9 M7 f3 q7 p* B
//------------------------------------------------------------------------------, q3 o% C# R! u* C: i
// ufsta8 f5 J) Y0 u) ]
// Entrypoint used when program is loaded automatically
. Y6 p& Z: a3 \# N// as NX starts up. Note this application must be placed in a" y5 Y; q2 Z0 k/ f1 a9 a
// special folder for NX to find and load it during startup./ }6 q. Z, o7 b6 m8 u0 e
// Refer to the NX Open documentation for more details on how
$ j, q; X2 d O2 A// NX finds and loads applications during startup.
) e, }+ ^7 k7 h7 S" p//------------------------------------------------------------------------------
, w6 r" g" l- c# Q- Jextern void ufsta( char *param, int *returnCode, int rlen )
2 _& q$ }+ ^0 W. j4 C{
7 E' }/ y0 }& z try
( w0 O1 P$ h5 D6 q {! a+ D; ?: J2 O
initUDO(false);% J! r# h6 O0 e4 S n
}. J$ j. W+ U, r
catch (const NXOpen::NXException& ex)
9 K9 {0 _! {1 K* D6 ]/ c' G {( x$ i; A3 y5 K3 i9 _. H' i A
ECHO("Caught exception: %s\n", ex.Message());
/ Y2 M" _( {/ R& F }
! a6 ?# |+ _3 W}. P( m% I8 x; A) _$ j9 `( C# h
) m. i( i% U6 \" V& U; z
//------------------------------------------------------------------------------2 ?- f# ^+ j& ]2 a
// ufusr_ask_unload9 i8 ^& l1 p: N0 [
// Make sure you specify AtTermination for the unload option./ l/ \6 C8 a6 p6 G5 F/ J
// If you unload the library before the NX Session Terminates
2 J; ?2 E: q* }# W4 E// bad things could happen when we try to execute a udo5 E8 J6 S0 s W" G: s
// callback that no longer exists in the session.+ U0 v; j: J: c* x) u3 l* A
//------------------------------------------------------------------------------1 y8 I2 A# F6 Q$ m' W
extern int ufusr_ask_unload( void )3 e7 w' \2 ~9 T7 g0 \
{! x/ e# \6 T3 r( ?
return (int)Session::LibraryUnloadOptionAtTermination;0 U( Y# }# m, U$ X
}
9 H3 B7 e6 u: d8 |
) l' A1 V$ l3 g# ~0 x |
|