|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
( ]9 f- a7 g3 R" z/ j1 E
4 o# k6 s% `+ n- v% I! vNX二次开发源码分享:NXOpen C++创建UDO的过程# D; `1 |7 j7 `* t
& [: O% H9 H' w& e* j. @' T+ U) R
: b8 w( f3 z4 w! ZUDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
* d$ V- T7 `3 `0 ?2 o+ ~
3 l4 ]) ?3 N" T G$ H) {4 K* H% E$ p3 T
; A) Z- l( _7 ^" z/ }; ~
#include <stdio.h>$ [8 K) Q& N2 |9 w4 m7 {& q$ }. ?0 g
#include <string.h>
: N; I/ X- [8 U2 y#include <stdarg.h>3 ^3 m, c- h* E/ W; `+ {
#include <uf.h>
; m& q; B) a& P( q% K: E#include <uf_ui.h>
* d1 X) b2 c0 W; F) K# f9 k#include <uf_exit.h>
7 X6 M& E$ w4 G6 E5 r" x8 z/ D#include <uf_disp.h>8 y+ r! }, F1 V1 S2 ^) l+ o
7 |( N. b1 V, b; rstatic void ECHO(char *format, ...)( z7 N9 [9 z Y" a' ~
{
: h; m6 }7 T) ~: v7 Z" m char msg[UF_UI_MAX_STRING_LEN+1];
9 g9 V& c- F, g0 a! ] va_list args;3 A+ c/ q% a1 Z
va_start(args, format);
V3 _+ ?% V- q+ n$ O) m vsprintf(msg, format, args);& j0 v8 G( l1 \# }4 m
va_end(args);
7 T3 M& {2 H! N- s- o- W UF_UI_open_listing_window();
: o5 a! w" t* y5 d- n* I1 n+ F UF_UI_write_listing_window(msg);
- t; N& m. J% [% u9 n UF_print_syslog(msg, FALSE);
1 g; s4 @) e5 W/ } p}7 G" I2 h: M. U
( J! ~ |4 u1 N) p, V
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))8 o+ t( f; ]8 A1 |* W( ?9 Y
# T7 z! E% r) q5 f% m
static int report_error( char *file, int line, char *call, int irc)
; Y" [4 ]8 A% e( U{/ E( k! \2 q y
if (irc)
# S' X i3 g8 c) \) L {# W% t' X8 I; |& p S* U1 o
char err[133];
/ s* M* p; W" g! y& q' ^1 d) R& z; }% E: b0 ?
UF_get_fail_message(irc, err);( V0 b$ S6 V L+ a1 r
ECHO("*** ERROR code %d at line %d in %s:\n",
6 x8 C. r) C& t, g6 P' N: O! ~ irc, line, file);
) W. |/ g1 E2 Q ECHO("+++ %s\n", err);0 w. z' g6 u8 }3 k& a, t" `+ j
ECHO("%s;\n", call);
9 z2 y6 t6 ^9 M3 d; ]) B }5 J) f$ V* F2 Q& ~3 |9 y, c
9 h" ^$ _8 f- X1 W
return(irc);" t* j, w: A' |: n j
}; V( E9 S% l! H
+ F" r; U4 I: j# x( A#include <NXOpen/Session.hxx> 4 m" L( j2 X! t# G
#include <NXOpen/Part.hxx>
3 n2 E! P7 H3 D, D% _% d6 ?" r#include <NXOpen/ParTCollection.hxx> & x" Z7 P4 N6 N, T
#include <NXOpen/Callback.hxx>
" l2 y( o- ]3 E#include <NXOpen/NXException.hxx>$ N0 G' L9 S# l+ H: Y0 V
#include <NXOpen/UI.hxx>
8 i' v5 N5 ]& M3 s#include <NXOpen/Selection.hxx>& l4 ?5 i$ Q( ^' F
#include <NXOpen/LogFile.hxx>% o( _" O' y% d% n3 ?
#include <NXOpen/NXObjectManager.hxx>
% |, j- N! [9 M8 C#include <NXOpen/ListingWindow.hxx>9 i- W9 r; n0 ^: n v
#include <NXOpen/View.hxx>& ^" c3 [1 ?, R. f
1 d6 C# b; L" w3 ^#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>2 ]! m1 c7 r1 z# [) o
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>
+ g- Z- k {7 K% h2 D: Z#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx># B5 D: n8 v7 K: H, k' F k5 W9 a
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>9 W" v: |3 ~5 r% i0 c( |
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>* j: [4 l8 q, N2 f
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>
8 n9 [6 }4 C( Z$ e! S#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>
/ J6 v' G5 f* [, A" L2 g' c, H#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>
* m* a4 S8 @$ Y3 Y. [. H8 Z' m4 F- y% E1 p( O0 s9 }
using namespace NXOpen;, ~0 V$ R+ |0 M
using namespace NXOpen::UserDefinedObjects;
; Z. B" [6 ^4 h$ w3 O6 g9 T* n
//static variables
$ a2 L2 x0 F2 z3 O7 D2 Xstatic NXOpen::Session* theSession = NULL;
2 k0 y2 N# J+ r [; L, rstatic UI* theUI = NULL;! [; Y, b2 b& s& b/ p2 t5 a
static UserDefinedClass* myUDOclass = NULL;
$ ~" G$ K& R# ?1 n* P0 \) [4 k5 _! X; a5 T/ D2 ~; W
//------------------------------------------------------------------------------
2 I6 c O- y9 o$ M$ \; c1 Y// Callback Name: myDisplayCB- c1 O4 i" Y$ Y1 W) t k
// This is a callback method associated with displaying a UDO.
" n8 h9 u' s! [8 A5 m* j8 @// This same callback is registered for display, select, fit, and attention point1 W/ s" p+ |0 X; i; m1 A( {) @0 U& ?3 n
//------------------------------------------------------------------------------/ W$ m5 Q& m' H. N
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)9 o6 X# H9 S& U
{
! v. h8 V# y4 i try
1 W! c7 ]; ]0 R1 g7 }6 F+ Y {
) [ X$ Z- d7 D$ B. F } // Get the doubles used to define the selected screen position for this UDO.
% o3 i8 k6 [/ I* G std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
, L( p6 c4 M4 ~6 a$ i" ~: E& H& f- a6 C+ O3 e( E! b. [
// Use the doubles to define points of a triangle. j0 r7 s0 x! w7 T. ?/ x
std::vector<Point3d> myPoints(4);" P' e9 `$ v7 p8 v% @1 w
0 I# `7 d" \- U# y: M1 m myPoints[0].X = myUDOdoubles[0] + 0;2 g" V& m6 I: ]% R; ^( f, Z Z
myPoints[0].Y = myUDOdoubles[1] + 0;
" @' v( `0 Z1 }% Y- j3 ^7 w myPoints[0].Z = myUDOdoubles[2] + 0;
* ]4 c7 e; X& l3 w3 N* Q- |
0 s7 o# B- g, V# ?* |+ d myPoints[1].X = myUDOdoubles[0] + 100;- f3 @7 J( Z+ d* ^1 C/ j2 f6 X
myPoints[1].Y = myUDOdoubles[1] + 0;
, e9 }) K' O7 E2 ? myPoints[1].Z = myUDOdoubles[2] + 0;( d, S/ f1 |8 s. F* a5 p1 K$ `* e9 F
& e5 a9 _% X6 g$ [3 @" ]$ o myPoints[2].X = myUDOdoubles[0] + 0;5 M* [; b& |; I
myPoints[2].Y = myUDOdoubles[1] + 100;
1 E1 L3 K* x" {+ M6 g6 J myPoints[2].Z = myUDOdoubles[2] + 0;% j- F( P; D# [4 U2 u
4 z, S& |4 e- n& s2 N3 |% J7 l myPoints[3].X = myUDOdoubles[0] + 0;
& b+ i# Q7 V3 ?! ] myPoints[3].Y = myUDOdoubles[1] + 0;- r' q( \- e7 b& v
myPoints[3].Z = myUDOdoubles[2] + 0;
1 ?4 O! P+ u" r! F E% V# f
9 _3 J/ U+ S2 }* v- o4 x: |& G8 i8 ^ // Display the triangle9 f& K2 ~4 f" q* K4 J6 c
displayEvent->DisplayContext()->DisplayPolyline(myPoints);
, {1 w$ Z# [4 I. G7 y$ S
! P$ t1 l2 G, n+ o7 X' }$ l) N // Display the text next to the triangle
9 K \; s/ H) K2 g1 t+ G4 Z. D7 T Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);; m1 P1 K& k; K
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);' v& L$ H- R$ k, c1 l- y
2 u9 a/ A" q/ Z
// UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653: @7 I) x8 n0 v# ~/ ~
// This demonstrates using UF_DISP_display_facets as a work around
1 w# r N" _3 p- \( F% Y; L, [8 C) u double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };* r, O, e9 B1 l2 {. B0 p9 r
double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
* z6 ]6 N4 E% L4 J, B0 T& @ myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],# g/ j* V( C2 o& L% |0 c" J
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };
4 ~- Z/ }/ N" R; f1 T' Z UF_DISP_facet_t facets[1] = { vertices, normals };
# l9 v ?5 u9 u' Y i. L* q void *context = displayEvent->DisplayContext()->GetHandle();
' u5 |, ^8 S" Y q6 Z/ E `7 \! j# v6 i- T. h: i. m
UF_initialize();
* g- X1 X6 T/ n) y8 ]+ [( b UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));8 o' Z+ \( ~: q) c1 U1 c* \
UF_terminate();
% R7 L- K) K Q% u' c) _, m3 r- H
}
7 b+ U+ j# ]. D+ y- P- X | catch (NXException ex)
( R: c8 e& Z! i: x3 i$ ~ {/ G1 q6 N9 _- g
ECHO("CaUGht exception: %s\n", ex.Message());+ ~3 E' s4 Q. i0 Q0 s3 p5 ~1 {) S
}. n3 T( N+ }* h j* ~& b
return 0;
7 I8 @2 s8 _) t! S4 v9 f}6 j4 C7 [$ N% R" i0 W
//------------------------------------------------------------------------------& I: b% V0 A! _8 _
// Callback Name: myEditCB
7 V5 D- u7 W6 W/ _7 ]4 i; y+ u& b// This is a callback method associated with editing a UDO.* b0 r5 x9 u$ I& \& w3 j
//------------------------------------------------------------------------------
7 E2 C0 P$ f( j. g, P/ b4 {% |extern int myEditCB(UserDefinedEvent* editEvent)
/ F" R0 P# m- H+ G{" q' _2 U2 j& L/ e! O; [/ e3 _
try9 w* b# x% K% I+ C3 h
{: N/ @& U% C, V& l# U: S
// required for calls to legacy UF routines
) ]! p9 N8 _ D4 I5 e f- S // such as UF_DISP_add_item_to_display* ?7 W5 N2 C5 {" c: Q
UF_initialize();
, v6 i2 P8 O# u( g4 ]% e6 F; D9 a5 E9 Y% C( z
View* myView = NULL;( W8 P* ?: Q* ]
Point3d myCursor(0,0,0);; Y1 Z" I, z3 U) l( V# k
1 J) {8 j l6 ^: h // highlight the current udo we are about to edit8 ?; \7 w* }7 k& w7 @6 {6 N
// this is helpful if multiple udo's were on the selection4 t8 ?0 f8 L9 K; j; n
// list when the user decided to edit them) C$ l# K) U6 C
editEvent->UserDefinedObject()->Highlight();4 S0 l* b# D2 B/ e; g9 ?& d" s4 E
; Z. S$ w: ]; P$ n // ask the user to select a new origin for this UDO! _$ C2 r% I1 L) q
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);" R' {% L4 d, E9 E; j
// we are done asking the user for input... unhighlight the udo
' D7 w- k/ p. P* v2 i editEvent->UserDefinedObject()->Unhighlight();$ L) T5 H5 c! k& w7 m5 |
7 `; Y q; O9 P5 z
// use the new screen position (if the user picked one)) z d/ J3 I8 w2 e/ f8 D- ^. W
if( myResponse == Selection::DialogResponsePick )
/ O; g) u8 X$ I/ w, Q& e# H; F- x {
$ v4 a6 C# C1 u std::vector<double> myUDOdoubles(3);! W4 r* L( R! L8 n5 a* a
myUDOdoubles[0] = myCursor.X;
7 S2 J4 e" `- O# r myUDOdoubles[1] = myCursor.Y;, Z- [- p0 x2 j: m; r& p l
myUDOdoubles[2] = myCursor.Z;0 e6 z7 j8 L0 \: U) ^
// store the newly selected origin with the udo
3 b- Q0 h) x6 h* f& | editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
2 E9 S M; }0 q& c& z: F // add the udo to the display list manually
: n$ H0 S* {. @3 I1 w // this will force the udo display to regenerate
& w9 g$ |7 J- d0 w. N // immediately and show the changes we just made, e% i _; Q3 }! Z ~
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());
" Y- e% ^- q/ Z. D; H5 o# ~) { }% `. }+ v, J. x4 L% d
UF_terminate();
8 T1 y7 R. V" w5 v, Q } catch (NXException ex): _. v, x! N2 ]7 s0 K: N: H7 ]- J Y
{: x5 U( z3 @2 |# D3 |
ECHO("Caught exception: %s\n", ex.Message());
- H, T+ O+ ~7 T0 X! @; s3 q } return 0;
8 G" u* D, H4 [2 x5 Y; H! {( c}
+ ?$ Y" y& ^8 b1 y. i% \/ |) l4 n//------------------------------------------------------------------------------( l( [3 w g; t2 A# a& } y/ K; e `
// Callback Name: myInfoCB
1 a/ D* @ I& T3 ]. v, b" P+ W3 `// This is a callback method associated with querying information for a UDO.+ Z2 z' ~- h5 s9 N \+ ?( t/ ~
// The information is printed in the listing window.
! q; H4 E% ~! a- M( x* k5 d( n/ p//------------------------------------------------------------------------------
1 g4 b' b( Y) X6 pextern int myInfoCB(UserDefinedEvent* infoEvent)
* P0 a) u* h; e0 s{ c8 X# X4 U7 f, o
try+ Y4 `/ o. i. R$ H9 i% R
{
7 d1 @4 [7 P1 U+ l! M$ \0 |# ^% g ListingWindow* theLW = theSession->ListingWindow();1 h; y: |6 r4 y( }3 E+ h' p
char msg[256];# C- a+ j7 T* t5 {$ k( i. f
theLW->Open();2 m5 V% c& d, |6 B0 @( o/ b+ y
theLW->WriteLine(" ");
, p$ C3 `/ N+ _! S. A! q theLW->WriteLine("------------------------------------------------------------");4 v# G* ]' E. k6 X7 U& Z4 F0 ^ L
theLW->WriteLine("Begin Custom Information");; b: d( c: N! e$ X6 s7 n8 I& ~: d1 x
theLW->WriteLine(" ");
" `2 P* b& d" \3 l4 S; V sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
1 V1 j! ?8 D9 V, M y$ V theLW->WriteLine(msg);& B2 h5 E2 U& V/ Y! j4 V
sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );7 F% {! G$ @" V% ]$ m. h* g- q1 C
theLW->WriteLine(msg);
7 W9 Y5 l% y r- x x0 p; { std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();& y z* j- l/ S3 K( C" p- @) q4 s
sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
5 O+ K% j; `' {! Q theLW->WriteLine(msg);
+ S; D; Z" X3 l' I: S& {" } sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );5 D& T, O6 b- M5 Q
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
+ f/ Z) S: n" X; Q theLW->WriteLine(msg); E' i9 B4 J! ?: ~& ~" z4 z; H
theLW->WriteLine(" ");
/ l/ h+ u' n7 c) n. J* G+ F theLW->WriteLine("End Custom Information");
! M4 _% s d4 ?8 L$ u0 @ } L9 U% P6 D) a
catch (NXException ex)
" C! \. i5 _* ^2 E; g$ u) V2 a { {0 k6 u2 w) |: Y- b6 k& U; q
ECHO("Caught exception: %s\n", ex.Message());
8 ?! V. G, N, ?! D& X }
( c$ G* ?4 e0 w5 Y return 0;" J; V& K! v" ?3 t0 n- }
}$ ~# H. I$ s8 I$ l+ s) z
" G. _/ h( b1 E2 Y& D//------------------------------------------------------------------------------
9 g1 x. @9 [1 t7 c- a! A( K% h// initUDO
, e" C) K" Z" W// Checks to see which (if any) of the application's static variables are. x( M4 m6 n9 d# v
// uninitialized, and sets them accordingly.
% T1 Y9 e( X; K D6 L// Initializes the UDO class and registers all of its callback methods.) w6 p! e: S* y
//------------------------------------------------------------------------------
9 ]3 U# z& J2 t9 k: |static int initUDO( bool alertUser)
/ S+ C# I Y E{
, ]! g3 @2 Y& M, {! _" f try: h) B/ n# C: O, M
{
2 P y" d, N' l. W {* G if (theSession == NULL)
5 c, ?, i3 d1 w3 I {
. E { l9 p9 |* @; X! W; m theSession = Session::GetSession();& e8 Z5 g4 f. F/ o1 f0 g
}- l' ~ B9 H" G6 v3 y4 ~
if( theUI == NULL )
; A, y4 r) Y- j' [3 z {) v' n8 b- F* K" R
theUI = UI::GetUI();: f+ h* h Q0 M2 M5 @' x0 I+ [" D
}5 M2 W. d" w7 Z2 }8 I, y4 K2 S) Q
if (myUDOclass == NULL)7 p& X* l! |& _5 y1 G
{( V" D) V2 M! G* @# x
if (alertUser), y$ F: g. }$ q! o) h7 f3 y1 e
{: {# } w; M% N8 Q0 [
ListingWindow*1 U+ @- A9 m- W0 ~% J
theLW = theSession->ListingWindow();3 k7 K0 }$ {7 I- e5 T% }$ P- d
theLW->Open();
, D% R) j/ Y' y M3 P$ N theLW->WriteLine("Registering C++ UDO Class");
/ O+ h( y/ E6 ` }
/ e$ S" Q* L& h% k! v // Define your custom UDO class9 f: F6 w6 E! y6 C0 z* X b
myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");, X: l, Z% y' ^, R6 K7 i
// Setup properties on the custom UDO class6 Q+ d* T3 `" o% g, h& @8 h
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);4 L& E# H E5 c; E, }8 ~. w0 F
// Register callbacks for the UDO class
0 ~) R# R& ^6 P' }0 Y: c6 I/ J myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
4 @# U4 W3 D5 @* S% l" g4 b7 y myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));- o& a H7 V5 ?" y; m. l# }
myUDOclass->AddFitHandler(make_callback(&myDisplayCB));
% o0 V. s" h& U4 X myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));
2 _: U$ t. ~( F myUDOclass->AddEditHandler(make_callback(&myEditCB));
' u) L4 ^1 ]: q4 c: C. _ myUDOclass->AddInformationHandler(make_callback(&myInfoCB));& C! q: X& h8 ?
// Add this class to the list of object types available for selection in NX.8 Q, B( J' L$ J( k
// If you skip this step you won't be able to select UDO's of this class,- P2 h7 e, p6 C: g
// even though you registered a selection callback.5 q5 ?% P4 h& c0 @% u
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);2 W* _0 x/ b3 I5 \% W. M
}' Y* Y; W' i7 Q( x) A
}
6 J6 Q0 Q6 c# R+ W1 l catch (NXException ex)
) f) T1 P" D1 t, H* V& A2 ?" _+ k+ l {* k9 D. L0 \ s' @6 N
ECHO("Caught exception: %s\n", ex.Message());
2 Z. {0 H( T* ^8 n/ ] }! C. z A4 s6 I5 t& {
return 0;
4 y" L4 C+ @/ i}
3 F* y3 t- s: e& P* ^9 M" }; v' E2 t* h. {% \9 e' ^/ z
//------------------------------------------------------------------------------
: ^2 i: I1 s8 z// ufusr (Explicit Activation)
) l6 B) p- F* R$ D/ e1 i// This entry point is used to activate the application explicitly, as in+ g' k7 g& C$ Z% h z9 _8 h. f% P
// "File->Execute UG/Open->NX Open..." z2 t) A1 K0 Y |
//------------------------------------------------------------------------------
5 Y6 |2 U6 n% N: C- mextern void ufusr( char *parm, int *returnCode, int rlen )8 P& F+ U0 \6 z, R6 W1 L
{4 @) G* h% h- w: E3 v s+ g
try
. T. X* j* Y1 P/ n+ Q9 Z, z {% E2 f& ?; }- \+ y( k. D/ h1 g0 F9 r
// required for calls to legacy UF routines
+ u9 E3 y" F3 f1 a7 [# u! @# ^ // such as UF_DISP_add_item_to_display
% m: Y d; B7 M' v- V UF_initialize();5 A# [" L# H: B; A+ p
* M. ^( L6 w0 H
// initialize the UDO - if we didn't load this library at, Q- a6 F+ r' ]& R" b
// startup, here is our second chance to load it( m6 a* k( F& R; x# ]2 J( I
initUDO(true);. b& D! f3 q1 C
0 Y3 ?4 U! w3 b1 j# N5 ~ O* D
// if we don't have any parts open create one/ `: [1 Y; ` `- f G
BasePart* myBasePart = theSession->Parts()->BaseDisplay();
' D( s- o U# t3 w* M if( myBasePart == NULL); G* b& R* A, n1 v; L: A* {" H( h
{
; i) Q/ \5 n7 L: J" ? p) A myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
9 w; [1 V( G9 p7 ]6 `4 W; E% Z, b }
: j' |) R* O# N8 R* q- [: H! R- Z" W" w9 c- J
View* myView = NULL;
8 J4 @4 J! k/ u- C+ e Point3d myCursor(0,0,0); E. w ?( F( A. {
$ q; R9 Z4 S5 _" @ // ask the user to select an origin for this UDO; O9 e* H j$ _- ]
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);, ], T, J0 N. {, \
if( myResponse == Selection::DialogResponsePick )% l& Y8 o& y0 w# H1 {- e, R( d
{) ]: m# q5 e ]( R+ u/ K+ b, |
// The user selected a point - go ahead and create the udo& I3 e6 e5 U& X/ r* \. l9 R6 Z
UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();; }- K/ r# o8 ^: R: w% o
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);7 v! ]$ ]; S( v
// set the color property of the udo - just for fun :)
/ O0 C+ G0 \- \, ^% f2 w firstUDO->SetColor(36);
" t& t5 K$ o+ z$ ]% @0 L3 | // store the origin selected by the user with the udo
# k. y9 v1 Z. W1 R# Y std::vector<double> myUDOdoubles(3);
% Q3 k1 \) x) _8 t myUDOdoubles[0] = myCursor.X;/ N0 E9 q) e/ h3 O+ @. ~7 N
myUDOdoubles[1] = myCursor.Y;3 S6 t& n1 C: {
myUDOdoubles[2] = myCursor.Z;
% T3 L9 c% }$ r& Q$ H firstUDO->SetDoubles(myUDOdoubles);
$ C/ a; E' f- O5 V# x // add the udo to the display list manually
+ k6 }, W* K: B* N- V // this will force the udo to display immediately
A* {% L3 r9 `! |1 p* l+ E" m0 [: w UF_DISP_add_item_to_display(firstUDO->GetTag());
0 B5 M: F5 i$ @$ q }
" f6 ]6 y/ b$ J9 p7 Q0 B UF_terminate();
: Q! q% V# k* E/ A% ?9 Q }& q6 O" T( G2 q4 ]% Y1 K7 x: d6 k
catch (const NXOpen::NXException& ex), W' e1 g5 r* X: H" u" j/ S
{
3 I4 n, q$ f P6 Y* y ECHO("Caught exception: %s\n", ex.Message());
# x: t1 G+ V% H& C }3 B: w; M" {1 a1 W. x; h
}" b! ?; u+ r; U5 d2 z
: b9 `: A0 A/ F9 x; P, D9 t( {//------------------------------------------------------------------------------9 x8 b' N/ u6 w4 ]% q: i$ D
// ufsta
7 I+ \; S, Z# L// Entrypoint used when program is loaded automatically
2 X5 G4 n- A2 ^) l n. O1 Y# k// as NX starts up. Note this application must be placed in a
* Z% V$ U( y7 G+ S// special folder for NX to find and load it during startup.
0 {7 l0 h3 _/ ]. o k+ \ O// Refer to the NX Open documentation for more details on how) Z6 }) `' e0 ~3 J
// NX finds and loads applications during startup.
" O$ A' W6 G' q; l: F8 a//------------------------------------------------------------------------------+ j. U9 Q* n7 e- m. b3 l! N6 @
extern void ufsta( char *param, int *returnCode, int rlen )- ^- p! n. L0 ^ v' j& N
{ v' t- u6 v2 w& }
try2 ^8 o" ~4 h& v4 O$ P# [
{' g1 x K& K6 {) U; g( `; N5 ]
initUDO(false);
) L" u% n3 _2 x- ^1 j/ D, o }$ O3 y, ^: ^# [/ e# A
catch (const NXOpen::NXException& ex)! z3 ?6 {" D) M! H: ~0 X- }
{
) ^: B7 P1 a( ]+ I/ V( w) m" Z ECHO("Caught exception: %s\n", ex.Message());9 Z" x9 C2 J/ S/ W* a
}5 k6 g I( s9 J( D
}. E4 J; c4 K! U3 S b+ z
6 |( x& K: _6 Q9 ^; l
//------------------------------------------------------------------------------
) ?# s" v: ]6 o; P% P& o0 z6 J// ufusr_ask_unload
: w/ o; x' h1 Q. K! ?6 O/ Q// Make sure you specify AtTermination for the unload option.
, |, K& _% h; B; Z" ]$ ]5 ~9 a// If you unload the library before the NX Session Terminates" h3 p; n& z- f* f$ ?
// bad things could happen when we try to execute a udo7 e& q! m, t4 ~ i
// callback that no longer exists in the session.
8 P7 K* z6 Q: r5 f2 u) Q5 |2 ^//------------------------------------------------------------------------------5 Q! [% A& X: B! Y2 Q1 R2 U
extern int ufusr_ask_unload( void )+ M0 i" b' Q% _- C, Y( K* p5 F, v
{
4 v6 |7 J: o( h, b) ~6 d. j3 N return (int)Session::LibraryUnloadOptionAtTermination;. r8 U- [9 }8 w' H( w) U: L" M3 m
}5 H9 r$ f+ a& Q( R2 v
' f g4 p& ^ Z. s8 m: b& k
|
|