|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
& ^5 A5 Y4 g0 v( |. |# ]) A! a( A$ E1 N
7 Y* R! c5 R& |0 M* u7 @NX二次开发源码分享:NXOpen C++创建UDO的过程
. P% c* b3 y, A1 a s# O* G/ h8 h
: }0 }' t, ^0 f0 u" P- _4 C& K8 q8 O( k+ S: ^7 G! t( L- d
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!6 _6 ^& S2 d" L3 G4 W6 D+ w0 P
) o8 w- ?# ]: U9 t& @
7 B0 R9 z0 p3 k8 ?: j" \* ]& M! L; h# r, H, l6 `
#include <stdio.h>
4 F) |. }4 T7 S- q3 W& x* v#include <string.h>
. a0 [0 i( ~1 M" P" G% m" ?2 {" H& r#include <stdarg.h>
) u( |$ z! H2 H2 q3 j) ~! z: q#include <uf.h>
) s1 I `! f, @9 L* O, \% k#include <uf_ui.h>) h& z! d9 h# D$ l- R! Q
#include <uf_exit.h>- L1 @3 T8 p% d* P. W0 z4 g
#include <uf_disp.h>
1 }1 y- ?% q$ U: Y- i
" j# I. {. h0 t7 z5 Qstatic void ECHO(char *format, ...)
4 ]7 k! c4 \5 \6 ^{! U2 r; s' V" W" w
char msg[UF_UI_MAX_STRING_LEN+1];
( H: z% L- b6 e" r4 C- A: _ va_list args;: w& J. t# n) `" ]! o2 j' {
va_start(args, format);
/ P/ n# Z& G" i8 u3 y+ X vsprintf(msg, format, args);% w1 w: f: R% [ ~
va_end(args);
) I- F& C9 B9 T3 c UF_UI_open_listing_window();2 @% i& `, ~( i7 q- i8 g5 C% }
UF_UI_write_listing_window(msg);
9 C8 P% R) e/ D0 D, x2 { UF_print_syslog(msg, FALSE);/ U8 k. D+ B2 X
}
$ y* f0 a- ^8 g6 M8 N
# O6 k9 @; [; ^1 o4 k4 g: s9 e$ _#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))* h+ I6 f) a; J$ x% [. J+ |& i
; r# L Z$ T3 Y$ G, c
static int report_error( char *file, int line, char *call, int irc)/ U; W# p& D1 c1 d! w' ?( Y& B# n6 [" t
{. E: N3 j6 l" F+ t. J+ M8 Z
if (irc)
2 P5 Y5 H% x4 f3 z {
& T/ E" Q9 G' f# ?$ Q2 e. x char err[133];! B) B7 U3 b5 j9 c# L
, ^% A4 q; Z: }% a6 o, R8 E2 T6 ~
UF_get_fail_message(irc, err);
# ?1 i0 V: i3 W4 d! ? ECHO("*** ERROR code %d at line %d in %s:\n",
5 E ]; _* O& U1 n irc, line, file);( Y& u |8 ~2 W
ECHO("+++ %s\n", err);7 c, w2 {1 s4 [* w; b6 b) L( W
ECHO("%s;\n", call);. t2 d- O6 w8 ~ e s
}4 x) \; h. O4 D$ c7 d- g
5 ?- H/ [( _) P( R. z! p
return(irc);
; l [; o5 k1 l* T1 L/ x' L}4 x ~& m+ i' \+ S6 I
2 s; s0 x+ ]: ~5 ]) ]3 f4 t$ S) L6 V' F#include <NXOpen/Session.hxx> 7 f" B& x, X* ~& f. ^; c. L! H
#include <NXOpen/Part.hxx>7 b5 ~% h2 y% d" F, E# k
#include <NXOpen/ParTCollection.hxx> ; ? f0 e, b9 V" p
#include <NXOpen/Callback.hxx>; U2 a4 q% N6 ~; a" M
#include <NXOpen/NXException.hxx>
: B9 g9 g7 Q' y' G2 C#include <NXOpen/UI.hxx>0 @' R+ q: k$ l8 Z5 m% E5 v8 L
#include <NXOpen/Selection.hxx>
! m& @9 M1 L. P" y! b#include <NXOpen/LogFile.hxx>; H+ K( { w' _, Y) ]; P
#include <NXOpen/NXObjectManager.hxx>
0 ^- f" `# @5 p( h- v1 N. }9 f9 n#include <NXOpen/ListingWindow.hxx>
! q" M7 U: b8 B#include <NXOpen/View.hxx>. C! Z- `* A: ?
9 n4 X; ~+ {' Y, Q
#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>* t K$ p7 u* I2 D/ w: D9 e
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>
8 n( J& \% D& ] l#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>
( ]6 @$ Y( X" d p#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>. v% O9 C' i/ r3 M( [0 N
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>& a6 D; F) }& I$ K/ i0 `2 K+ [
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>
3 _& T5 G2 R2 K" D. l! V( H#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>
( L% D4 z8 u+ l& x9 W" D% `+ V2 C3 g( J# v#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>1 {2 e1 S8 |, r0 ?9 |( V
5 r# T' w3 D! I! V0 c/ t4 l
using namespace NXOpen;
7 L8 s4 ], z. U* c3 H" c# o* @ [using namespace NXOpen::UserDefinedObjects;
" s l8 R! L4 L. H% ~& o# s% R
: \7 n7 X: x) L6 O1 ^9 ?# a. \//static variables' C* M3 l+ f' x& Y2 h! r9 n$ M
static NXOpen::Session* theSession = NULL;
2 v# t4 U* l9 d$ Hstatic UI* theUI = NULL;/ o5 a1 A4 ^8 l% Q5 F2 `- w8 f$ B/ V! R
static UserDefinedClass* myUDOclass = NULL;& T/ n, G( X9 O& Q
q# h# K$ h$ ~
//------------------------------------------------------------------------------
$ v; g0 i. P# b) K% ~' K// Callback Name: myDisplayCB1 l' y. L7 ~9 Y& x+ c8 N4 K' `0 i
// This is a callback method associated with displaying a UDO.3 N- T2 y/ c' r
// This same callback is registered for display, select, fit, and attention point
6 @+ R$ S2 j1 g" ]$ \) n+ M4 s//------------------------------------------------------------------------------
- }) E2 y7 Y. K5 }extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
* C+ I- `4 n# n5 b{
$ }' X; h# P9 }/ y+ ? try
& J$ Z' H) b& Z# t) I {
. ?$ X: V- a1 ~7 f2 r& x, w6 { // Get the doubles used to define the selected screen position for this UDO.! }" [; F/ A. h6 H1 I* ? Y
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
/ g7 u2 i% `4 ~: `
/ b" \6 B- N# U9 r/ N5 n // Use the doubles to define points of a triangle
% `7 _ T/ P: J' X- R std::vector<Point3d> myPoints(4);
0 L1 I1 |: p$ Q0 k( c7 `) x: n% d4 O" B+ d0 |" ~2 b
myPoints[0].X = myUDOdoubles[0] + 0;- c) g( g P/ V2 h4 V# I
myPoints[0].Y = myUDOdoubles[1] + 0;
I) p' ^+ J8 k& @* B1 R9 x3 e# H myPoints[0].Z = myUDOdoubles[2] + 0;
, F1 ^3 \6 E/ B) M& q/ G, C1 W' f( q
myPoints[1].X = myUDOdoubles[0] + 100;" r( J9 \, v! G; n# C; F! ]
myPoints[1].Y = myUDOdoubles[1] + 0;' ]/ |* B. L% R( n/ J: [
myPoints[1].Z = myUDOdoubles[2] + 0;, }& ~# O2 F& z
' a' K: X/ ]: c* e1 `; t+ I
myPoints[2].X = myUDOdoubles[0] + 0;
' E, T T: B. ^& V* q myPoints[2].Y = myUDOdoubles[1] + 100;; Y6 y% D4 z M, }
myPoints[2].Z = myUDOdoubles[2] + 0;! l1 @1 \6 }0 ` U. H
! [4 X& E! P# K% [& } myPoints[3].X = myUDOdoubles[0] + 0;
; K1 A0 c5 W x myPoints[3].Y = myUDOdoubles[1] + 0;; Q9 E( d+ S! {: P' O! D
myPoints[3].Z = myUDOdoubles[2] + 0;
8 _5 u/ j- I5 I, F% c0 o5 \/ E
7 j9 f2 t7 w$ C/ A# ^0 R // Display the triangle5 c1 _$ v2 {9 |+ b$ F3 \& x
displayEvent->DisplayContext()->DisplayPolyline(myPoints);2 \- i' w# d/ G. `
% y% d% Z2 y! C // Display the text next to the triangle
" S6 u' a+ n% T6 f Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);# z, l, U3 u6 u1 n! m- ~4 M. m
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);/ e: u7 b+ ]3 F. ?, i- W
2 U( P0 Y) k( c2 Y9 } // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
% y: l" D) ?3 i8 @+ Q // This demonstrates using UF_DISP_display_facets as a work around* v$ x+ Z# r- u! G1 [
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };; {" W3 l3 ?9 D) Y
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
) M3 D. B1 p# V- r- r' q; k myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],
6 i" g8 N5 X3 y2 U# h myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };, o% s8 q0 V6 \/ [' O
UF_DISP_facet_t facets[1] = { vertices, normals };3 t/ d# q7 h4 ?1 u# V% B
void *context = displayEvent->DisplayContext()->GetHandle();
/ c, N% e' b/ Q7 J1 L, T7 a: o7 S0 I4 M" q% u0 P3 D
UF_initialize();; l5 [) f8 R. ~- @* n6 P9 d
UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));3 d8 g" L$ W6 i& w S
UF_terminate();
l$ P3 F" b; k1 K. Q4 Q2 g x0 E. G( d* _, L6 L1 t! R
}0 c) j2 r( T, ?- B9 \$ K$ v
catch (NXException ex)- V( _2 J8 [9 A/ P
{
$ Y7 s$ u, ^7 @ z: \8 m ECHO("CaUGht exception: %s\n", ex.Message());1 O" b& J( J4 x: K9 z
}
" M$ [ T* w4 e, F8 D% ^& @8 r6 w return 0;
. _2 m% }/ m. Y}
* q2 C- l( ?8 ] ` @. a$ L//------------------------------------------------------------------------------
% X3 l6 ^0 y) n* e% V; z! d$ B// Callback Name: myEditCB# ]# M E( ~( [, A* k/ T
// This is a callback method associated with editing a UDO.
) W* q/ l1 F. J) N4 H7 I4 R% b8 H, L* a//------------------------------------------------------------------------------8 Y- b: R; D2 |$ J* S
extern int myEditCB(UserDefinedEvent* editEvent)
. _; s& U* y2 ~{
) p2 S' o. K$ Z" a% h try! B% \6 _/ V% X' b9 \
{7 {9 U8 b/ Z X* C
// required for calls to legacy UF routines
, U! E5 I7 S8 b: l) V // such as UF_DISP_add_item_to_display# e. s0 |, r- k7 X
UF_initialize();
Q; `0 U N* E' D$ ^" H% |; v0 j t f3 E' R
View* myView = NULL;. d. C+ O# v. f" L& W+ U* |! X
Point3d myCursor(0,0,0);( w5 S5 \9 f. `9 X
; b4 w& H& \% s, A. q$ l8 t2 v
// highlight the current udo we are about to edit
% \- S3 E: H9 Y // this is helpful if multiple udo's were on the selection
) S; _6 D; A6 B% u" I // list when the user decided to edit them
7 H' h) _& r7 |; N( e editEvent->UserDefinedObject()->Highlight();
$ j9 i' X" E5 {3 `4 s
p5 ]; \7 i, l // ask the user to select a new origin for this UDO
5 {3 f+ T R) j' T Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);5 j$ }8 G" v( R6 K$ v
// we are done asking the user for input... unhighlight the udo- H" {* l( S) j. L z
editEvent->UserDefinedObject()->Unhighlight();
" d, S, ?% ~* Y$ r# e& G
6 Q* z" D5 ^- V+ Z // use the new screen position (if the user picked one)
' y" ?* f7 {: ?5 N t) ] if( myResponse == Selection::DialogResponsePick )
: F: [# E( N/ g' b. \4 t: X y' ] {/ Q j4 @( s, Y& l8 A. f
std::vector<double> myUDOdoubles(3);' R% `7 V2 ~( b/ w5 ^: s; S* |% _
myUDOdoubles[0] = myCursor.X;: N) ] k7 f+ \
myUDOdoubles[1] = myCursor.Y;
: T; _" r- F9 }1 a2 H myUDOdoubles[2] = myCursor.Z;4 c" D3 m: p& y8 \
// store the newly selected origin with the udo
& V3 u$ s) U j2 w, v8 z" a editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
: p" w* x( g2 _: z1 p. @ // add the udo to the display list manually! [4 z. J8 `3 n, d/ b w- w2 |1 ]% ?7 C
// this will force the udo display to regenerate8 Y d. z( u6 C0 C; \9 u
// immediately and show the changes we just made7 }) j V; r" x( C, }* \
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());( H8 v4 b A9 }2 P; e
}
# j0 S5 \* y5 s% s' X `8 z9 U* f UF_terminate();1 `7 n# m) d1 y3 P" R
} catch (NXException ex)
# g0 X! m: k C1 j5 H" v# i: Z {, \+ E h+ [" B% R1 z# ^1 ~
ECHO("Caught exception: %s\n", ex.Message());$ V3 v7 O( p, s/ ^
} return 0;+ [2 M: a9 @2 r6 C6 m$ V% [
}' b$ j8 o# t R# x
//------------------------------------------------------------------------------
$ G. E5 \& |$ ]7 J// Callback Name: myInfoCB( x: H# D& N/ H. ^
// This is a callback method associated with querying information for a UDO.' M; ?1 ^& l* k! y2 V+ `% E
// The information is printed in the listing window.
s; U1 P9 c: d- N: o. s; @7 F0 R//------------------------------------------------------------------------------
% M1 ]: Y' Q$ K7 C0 |extern int myInfoCB(UserDefinedEvent* infoEvent)
* M v% u+ @/ K2 p# I. M{
2 s& F* Q; ^8 Y7 S% U& Z try
5 Z8 `. g O3 U( F) ]$ G# R {
( }3 J" a% w" ^8 J( n' O) u ListingWindow* theLW = theSession->ListingWindow();' X# Y0 Z0 D+ W. a# Q0 a
char msg[256];
7 L5 z. O5 X6 o- s" h5 k theLW->Open();
1 L/ g2 g# Q* [( [* F theLW->WriteLine(" ");9 G/ {: ~( ^3 E5 F! s X" ]
theLW->WriteLine("------------------------------------------------------------");( v% n g8 U. v$ w9 S& R( F
theLW->WriteLine("Begin Custom Information");- B9 m5 O! P6 v5 Q% v' \$ f- D
theLW->WriteLine(" ");! B% I/ J8 M+ w; U& f
sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
, n- n7 I8 @0 h$ | theLW->WriteLine(msg);/ i( t2 `3 T/ U& C" U9 z' I
sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
3 Y! Q# ~! {4 K9 Z3 n Y theLW->WriteLine(msg);" i- ^9 `/ M$ c8 l& f# [& Y1 I5 M
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
" S- ~ u% [$ b sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
7 W1 x# z7 |4 p8 a: E' e7 V+ u theLW->WriteLine(msg);
- z, h \# Q! q3 p, n3 k$ {/ ^ sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );2 P( S! _+ _/ V( F' z" n! I
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );( C2 K1 e5 x# e9 \5 Z( Y
theLW->WriteLine(msg);: k, t) R2 |9 }1 {
theLW->WriteLine(" ");" E/ S$ _: ?, D/ H! e) h& R# Y
theLW->WriteLine("End Custom Information");
`9 X Q! O+ P$ R2 E7 s }7 a$ s8 p; _9 y# T
catch (NXException ex)
1 a1 T5 [" P3 y/ w8 k1 K/ @4 B {
* u% t; `% i; X( X4 M8 i0 ~3 n ECHO("Caught exception: %s\n", ex.Message());
8 W8 k+ J* K4 Y+ H9 f0 h2 ] }5 S- R7 U+ H* q0 F7 i6 k
return 0;
: j. z* ~8 L0 m- Z* E}
& d( _8 s; I3 L0 G# V+ L+ T+ s
$ y, |+ B) r2 g//------------------------------------------------------------------------------
& i, ~! J- v) t! P: |// initUDO
) W- c0 k9 r( N5 T" J// Checks to see which (if any) of the application's static variables are
% w# M% t" E# c; c ~// uninitialized, and sets them accordingly.
. S3 ?% V2 e; g: K2 O4 }6 @* G// Initializes the UDO class and registers all of its callback methods.
3 h+ n5 |9 t) Y3 [* T9 U//------------------------------------------------------------------------------
, Q. q/ q! l& j7 Sstatic int initUDO( bool alertUser)6 L% Y" F4 V3 O6 n
{8 Q5 m0 X( q) i. f7 |% b) D
try
1 d9 G6 o; C/ T% W8 H1 v N+ A" k' C {
$ B4 H( G2 O5 u+ \0 m) z o if (theSession == NULL)7 o$ R! ^) m( Z
{
/ h3 X/ c- M$ o5 d1 i d theSession = Session::GetSession();4 S# E0 b& f4 s' P0 I# b/ U
}, @9 w- c3 O4 \9 F0 s+ K
if( theUI == NULL )* d6 u) P" s4 A
{1 u+ V+ Q% ?& \ e8 v
theUI = UI::GetUI();
: \8 i }* K( Z6 a" } }
$ r" T7 i4 L! o; U$ H, t4 l) a% U if (myUDOclass == NULL)/ L1 x) N+ g* k9 p. w' A
{, f, s- [/ G& G/ U! s& y
if (alertUser)0 }0 }- ~, d' F& @# n, N
{
: T9 t; A6 `; X$ Y" s1 [9 V" F ListingWindow*
5 @) I. @7 a, D' E theLW = theSession->ListingWindow();
# {3 B6 N9 E) H& m6 l# G theLW->Open();* t- `% p3 Z: W* P
theLW->WriteLine("Registering C++ UDO Class");
3 M, F& i% I: U7 g, {# d; j8 b8 i }" I6 J0 Q* F* h0 M
// Define your custom UDO class
5 G' r1 r' l1 X& U myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");
6 i. s z7 |# ~/ F* t // Setup properties on the custom UDO class( A* {* T2 m) X
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);
, d! V9 h8 f6 p# T" x // Register callbacks for the UDO class1 ?) g) F; F. Z/ a4 I# H- F7 D
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
+ H; f" ~# P5 x myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));
/ [9 G' r6 u9 l# ~; Q, }: L# T myUDOclass->AddFitHandler(make_callback(&myDisplayCB));8 Y! j3 z/ ?% P0 Z
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));
: Q7 Z) V( [/ c& s* c* S. a% e9 Q b u myUDOclass->AddEditHandler(make_callback(&myEditCB));- ^ v9 i( ~" {1 ~6 x7 Y5 }/ k
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));
9 n5 l' r$ Z6 |/ F // Add this class to the list of object types available for selection in NX.
, k( y/ g2 a7 T // If you skip this step you won't be able to select UDO's of this class,2 H9 V w( ~$ X: ?1 Y
// even though you registered a selection callback.) A1 C b, G$ z! }
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
) v7 F, D) u! W }1 r" T2 |4 Y! h
}
0 z, k7 U3 O* e! I catch (NXException ex)! z! ^8 \4 c' P' Y' G
{
" ~% X0 Z8 S% L' h" H7 P ECHO("Caught exception: %s\n", ex.Message());
9 O* @3 o8 b8 x O7 X }0 c" d; V0 p- f* Y9 [
return 0;
% x) O0 [& n& U- L}; A4 R( k" k$ H7 ^
+ q' F& h4 ~3 M$ I1 j& }//------------------------------------------------------------------------------# z1 d% h- {5 h0 `
// ufusr (Explicit Activation)1 t5 B7 y2 d& Z, }( ^ q
// This entry point is used to activate the application explicitly, as in
" N( {2 Y0 d9 e2 n// "File->Execute UG/Open->NX Open..."
1 N5 |- l/ y- ?7 y//------------------------------------------------------------------------------# f6 G2 P4 r. u3 Q4 V
extern void ufusr( char *parm, int *returnCode, int rlen ). J+ y$ f; j, z5 e. N5 ~" d
{* ?) k6 I" O; \& K; ]8 |3 S# u8 }
try
+ W& Z& T, w8 A8 p {
+ k/ j7 C6 [2 B' J5 F5 j1 D6 p // required for calls to legacy UF routines
* H6 m/ b s; \6 I // such as UF_DISP_add_item_to_display" z/ T, ]) ~" ~; }
UF_initialize();
- u- Q e. s6 a( k+ v# D. i$ a2 o% ^5 d% ~0 F4 c3 \
// initialize the UDO - if we didn't load this library at
7 \3 \; x: y2 @4 u6 k, h9 P* X4 G; ? // startup, here is our second chance to load it
- c; V+ p- h9 G+ Z3 n initUDO(true);8 G$ N" S0 x/ b m( U5 b
- J2 A. z8 [* _5 ]( I // if we don't have any parts open create one/ f6 s. c0 \/ b7 T% w8 z8 I* o
BasePart* myBasePart = theSession->Parts()->BaseDisplay(); k4 j# L5 c/ }9 Q' V H' Q
if( myBasePart == NULL)% ?% o$ K6 V5 z
{
/ d H: B% u7 s$ y+ j) P) L myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
( l# y8 V9 E0 t3 ~ }, f: k" L5 c$ S8 [8 _
! P0 A& g4 m7 ^
View* myView = NULL;
3 u0 m' P# J; u$ L6 s8 [' A Point3d myCursor(0,0,0);: A5 a7 s5 `9 D+ F& d
" c* g' Q9 q5 e // ask the user to select an origin for this UDO
" e( v0 T) [: r Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
7 B; T! p4 _7 k- f) m% X! ]5 K if( myResponse == Selection::DialogResponsePick )( ^, e O( ]' J
{
! ~, I& g; L# f }( X) A9 B1 v J // The user selected a point - go ahead and create the udo
0 M8 E4 l' h" h9 V UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();
5 N9 \& n" j( t5 \2 } B$ C! i UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);7 j* I) j }9 i! _: l
// set the color property of the udo - just for fun :)5 ~+ f, m' r4 B. d5 d
firstUDO->SetColor(36);
% [7 ^% L6 n+ Z# A% T7 ~ // store the origin selected by the user with the udo
7 q" R8 k6 ]' v, Z std::vector<double> myUDOdoubles(3);
& W2 ~+ q% i2 ^' L) i0 J myUDOdoubles[0] = myCursor.X;
/ g6 z( K; c2 f8 f* d; } myUDOdoubles[1] = myCursor.Y;8 O. [- J* T$ D x" y1 P2 b
myUDOdoubles[2] = myCursor.Z;' k& ?7 ^! Q+ y) ^/ Q* G9 M6 I$ n
firstUDO->SetDoubles(myUDOdoubles);# G# j2 J7 A% y, I$ K- i/ \! C
// add the udo to the display list manually
7 b# K# X: L' e5 W8 o! H // this will force the udo to display immediately/ U1 y" B P8 T- c$ G
UF_DISP_add_item_to_display(firstUDO->GetTag());
' p2 l. t. ^2 S9 C0 t& D7 @2 |3 q }
( s; W( K/ K0 m( S7 g( H" r UF_terminate();
3 D' e& z0 d- S4 T6 X2 p8 Y6 P, k }
0 d" u% l) v; l. v- g1 X0 A7 [ catch (const NXOpen::NXException& ex)
1 |$ k- ~9 }9 a- V0 P6 W {# Z( Q0 M; U- ]+ }" w, a
ECHO("Caught exception: %s\n", ex.Message());
/ E+ i# r, h8 ?& \/ ^! y }
4 ^4 _& T: d6 @8 R}
7 V A- C( E4 W; M% I4 x" r) [
4 Y& h! P# T, h% V J+ y//------------------------------------------------------------------------------! C) G: j' K: e8 _1 @! ~6 L
// ufsta
: ` ~ J: I6 ~* [// Entrypoint used when program is loaded automatically! I" L) [3 S3 c- K
// as NX starts up. Note this application must be placed in a
+ ]# F0 ?$ ~& _& W* i' H// special folder for NX to find and load it during startup. ~# {+ W8 Z1 s1 w; a5 f: W5 R
// Refer to the NX Open documentation for more details on how0 v6 ^/ [: {' u& K
// NX finds and loads applications during startup.
& L' b& A+ \. g( C7 h//------------------------------------------------------------------------------
4 I2 Q: y$ U! ?0 ?( nextern void ufsta( char *param, int *returnCode, int rlen )
9 _: s' @; s' b# q' [* W# C{* Z. |- a' D3 Q1 P
try" ?: }8 n! F: x3 i1 }2 e. m
{% [- S0 G% |4 q" f7 K8 `, F! r
initUDO(false);
3 F( o; h. a" m6 N5 w6 G" [0 j }2 T. j7 w/ {, c) k/ M
catch (const NXOpen::NXException& ex)
/ u/ A- v* x) b; C0 \4 M {
2 t* A, [! C6 j: r# ]! ^; Q, s ECHO("Caught exception: %s\n", ex.Message());
2 O$ D: O9 y$ M0 H }
) J: S. x8 ^3 \) i0 D}1 V; @! T& o9 k$ q6 w
/ @' I+ t2 x4 `//------------------------------------------------------------------------------2 T# h5 Z T+ b. S- I9 y) X6 t
// ufusr_ask_unload
7 N' e, C/ K( z! @8 @4 W// Make sure you specify AtTermination for the unload option.1 |5 L( O+ S2 w/ e
// If you unload the library before the NX Session Terminates
3 j6 P; H7 P: H5 M// bad things could happen when we try to execute a udo
6 K/ B2 \1 H0 X' `8 T# L. H! j1 F8 i// callback that no longer exists in the session.7 }) g1 L6 o7 s7 M5 E4 c7 E) |
//------------------------------------------------------------------------------
, I: C4 f3 o7 q# M+ x/ O' D- fextern int ufusr_ask_unload( void )
7 W. F* p2 a( d \; o1 F5 z{
' X, n/ y( C/ Z return (int)Session::LibraryUnloadOptionAtTermination;
- ?0 }" T! T" t# L) Z1 u0 i7 B}+ p6 G; j0 {# ]8 m& r) N5 d3 l
* r( U% I1 g- O4 C; D |
|