|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
, O& a0 ~7 i: V, E0 u
5 p, Q0 Y/ L1 [0 ^: N
NX二次开发源码分享:NXOpen C++创建UDO的过程
3 ?% T% D F: p, o, ]# \( |; O8 U, {2 _) Z# b7 N* X" W/ G% ^/ g
$ b. q4 g9 @/ R" c# p2 I
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
9 Y& e2 [* ]3 U0 o4 U; ]
! `6 b6 b7 f: \6 _9 ^& P/ K, {( f8 l" m7 t2 ^, H
. a5 \, ]5 [: |* N" z0 \4 Z#include <stdio.h>
) ^4 o0 p# K# h#include <string.h>0 [9 O8 i( b, I' g5 N E
#include <stdarg.h>" H* s7 x( b2 T% ~
#include <uf.h>: S' D# G+ n0 w `: L- {# w {# u$ k
#include <uf_ui.h>
; i0 Z D8 k8 ^) [& H6 i1 V9 v#include <uf_exit.h>3 I0 `: U, X/ {; g, `0 g9 T* k
#include <uf_disp.h>& {% u% Q6 w. w. s9 p4 N
2 |8 R4 w7 n' Q% O/ V* \$ S
static void ECHO(char *format, ...)5 Q/ V y( x! o% m
{/ m; g; x( ]; K( e' I
char msg[UF_UI_MAX_STRING_LEN+1];: ]2 i E* _( c1 u
va_list args;8 m6 t4 z, u0 `) s0 G; A4 J
va_start(args, format);
) r: ?: \5 n/ `4 T5 |8 k9 T+ o vsprintf(msg, format, args);
" l; }$ C$ R8 G2 `, O5 _ va_end(args);
) N. T8 q% R7 v2 e4 l UF_UI_open_listing_window();' K& G9 K8 `: x' E5 @+ H
UF_UI_write_listing_window(msg);
7 _5 I/ n Y# C9 {) q: B2 V" ~ UF_print_syslog(msg, FALSE);; U2 U1 T3 \2 q8 r+ D& U
}
2 z% ~; k( v) O) J
5 g9 x6 s9 s* x#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
7 |# l# V9 R u9 P S& K/ [& b$ N6 i% P m# q: f7 e0 n
static int report_error( char *file, int line, char *call, int irc)# W/ m8 o9 J+ u+ B2 P9 t2 \
{
& Q! k/ k5 ]3 y- ?! N2 J if (irc)
( F# E) M' c' t& o$ `- T {( ?/ w8 Q$ d7 k* J2 d' {
char err[133];1 X1 p; y) B9 r7 A8 T
) F! r1 z% t; D2 ^# `1 U) h5 ? UF_get_fail_message(irc, err);3 Q# ?& ?6 r X* _5 a
ECHO("*** ERROR code %d at line %d in %s:\n",
& U- W. }9 g+ x* c B irc, line, file);
j. Z6 \* g9 a- U4 i6 E ECHO("+++ %s\n", err);) Z! s5 t5 L7 \: v
ECHO("%s;\n", call);
{1 F; i4 j* d- |8 Y8 M3 f8 R; [ }! S: |) w" x9 S. X/ }6 n# o
* h J5 v9 A! }
return(irc);
$ J X7 q( k8 e6 U1 j. {! v( p( u}- W" d7 z3 g7 V- {& N
( W8 d6 h" T I5 b6 u#include <NXOpen/Session.hxx>
, E4 G3 ]7 g; O2 o# Y0 _5 y#include <NXOpen/Part.hxx>6 D% P9 A6 ?6 U9 [3 ?
#include <NXOpen/ParTCollection.hxx>
4 d+ A5 q) Q6 [. k* }#include <NXOpen/Callback.hxx>5 |' K) ^; d; G1 X. t* Q: `: {
#include <NXOpen/NXException.hxx>; Y- x# }' C" g: G
#include <NXOpen/UI.hxx>
8 S2 o, P+ u/ I0 T9 x& Z#include <NXOpen/Selection.hxx>
5 ?0 L, r2 G0 V; p0 t4 Z3 ? |#include <NXOpen/LogFile.hxx>
( C3 R, @; j5 [7 i- F+ G#include <NXOpen/NXObjectManager.hxx>3 W, _) C0 T) U* ]+ y8 A, x0 S/ }6 H
#include <NXOpen/ListingWindow.hxx>
7 I2 T+ U) Q% c: s4 x#include <NXOpen/View.hxx># y p# [. I3 t9 S3 ]
9 x: ^5 n; J( s+ [; ^) P#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>
4 t8 M& c, z# W! m, S#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>5 _' d' y) J$ |. A, d
#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>
. G. i3 A3 R" i3 r* B#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>/ s' A/ Y' }& r J
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>& q% C& G4 J( ^
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>+ y1 e! c1 ?& O& G7 Q6 T" J9 E0 ?
#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>4 p" L0 Q9 a; E" ?3 N
#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>
5 ?9 U, |$ L1 }, Y. n; g9 }/ f9 h1 Q! I$ p% n
using namespace NXOpen;+ H0 L" p7 L r$ P
using namespace NXOpen::UserDefinedObjects;/ b+ |5 Q/ q1 n( ^
/ q" j- }1 N, p" W; \//static variables+ _, g$ J4 f4 W' Z
static NXOpen::Session* theSession = NULL;4 d9 T) {2 `# m3 {1 d4 p
static UI* theUI = NULL;5 [/ I9 X; F5 M( L1 A0 Q
static UserDefinedClass* myUDOclass = NULL;9 h5 e) }' i" Y& G) N$ X; ~) M
5 T! Q+ _! e. |( c! k/ E% V0 z//------------------------------------------------------------------------------- g, C2 p5 L: v M
// Callback Name: myDisplayCB! R( l. ]4 ^5 f/ |: Q3 `
// This is a callback method associated with displaying a UDO.
5 e9 H9 t9 M9 ^- V# r- Z& k// This same callback is registered for display, select, fit, and attention point
) L2 j% S% b: Y1 D7 Z//------------------------------------------------------------------------------% V9 _' H" y! e# M9 D" t9 O0 J) A
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
: z; C. S1 b$ G1 b5 H: e) s$ B! g{
0 e; Y% q F9 m7 ` try+ {8 g$ |- e2 V+ [8 G8 p5 N- u
{% J+ B9 Z( Y) a6 O2 o
// Get the doubles used to define the selected screen position for this UDO.
7 d2 j! J/ e. p! Y) r) P- ` std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
( r8 _- X2 W. m2 }- _9 d% ^' C/ @8 F7 t/ U: Y2 I# } A1 ?; p
// Use the doubles to define points of a triangle" y/ d, N( v' y( y- d- N2 K, `) e1 H
std::vector<Point3d> myPoints(4);) Q; c U2 f/ v0 t
2 ?/ E7 v; C; z) t& }4 i: J. A, n
myPoints[0].X = myUDOdoubles[0] + 0;8 |8 `( R2 L4 r# H* r1 D
myPoints[0].Y = myUDOdoubles[1] + 0;) \' j; f% L, o+ J& q" S1 D/ [) _1 ~
myPoints[0].Z = myUDOdoubles[2] + 0;
# d* p, ~* a& ]
# ?- r9 L& p% P2 n% [# c" a myPoints[1].X = myUDOdoubles[0] + 100;$ ^! q- v- m$ Y. h- v. P6 l
myPoints[1].Y = myUDOdoubles[1] + 0;8 u, u; \4 t2 o4 s3 `9 ^: W+ J' Z( O
myPoints[1].Z = myUDOdoubles[2] + 0;
) s" [, C9 W# q! R+ H
i/ u& O2 O& X* s( u$ x myPoints[2].X = myUDOdoubles[0] + 0;2 y. s7 g3 p& X6 o/ h2 D
myPoints[2].Y = myUDOdoubles[1] + 100;
* q t. G+ x- p% v& ?0 i& ] myPoints[2].Z = myUDOdoubles[2] + 0;
4 O4 z. z( k4 I& w8 ]/ X8 k
- j; W, y5 D* j& ^) l6 B c myPoints[3].X = myUDOdoubles[0] + 0;
6 |; K" p, C: B G) Z myPoints[3].Y = myUDOdoubles[1] + 0;, Z+ z/ {# i! w9 O3 r; h
myPoints[3].Z = myUDOdoubles[2] + 0;" r1 G4 S' q6 s- [0 g) F
0 \' e6 t) Y0 Q8 D3 C // Display the triangle
5 k! P) [% v" w/ j2 Z& }! u1 V0 w displayEvent->DisplayContext()->DisplayPolyline(myPoints);" O) A* b# p5 b# v
8 i& O/ w& P6 `$ U. |
// Display the text next to the triangle
1 r; _0 |, m! [( ]3 G6 e4 x Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);
. r5 |( M7 h7 ]0 R displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);
8 H, ]( {/ |5 `; l! R
4 S E2 R+ m9 S8 z. K // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
H7 [0 p1 w/ V- D7 @: ]. K7 Y // This demonstrates using UF_DISP_display_facets as a work around5 G, p. {" M$ E
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };
) \8 T/ b- |2 {+ c+ _. J double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],& n8 h, N2 S ^" a( @+ ~5 D
myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],
+ U! P' T5 p/ L myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };) }( Q' a/ i# Y0 Z* D- ?* p
UF_DISP_facet_t facets[1] = { vertices, normals };- l, ] z" t& V* m+ E! f
void *context = displayEvent->DisplayContext()->GetHandle();( R: s' `: m1 {+ C% f
/ d/ i% u/ y. n' j UF_initialize();& {. W2 m2 |6 ?
UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));# m' A! ]- r. p$ ]! V! G
UF_terminate();
" \) F- o2 M& y+ O5 G
0 O1 }& `6 Y: ~$ z' t$ i }
# u: x5 a/ S* `0 A& N; Q, F catch (NXException ex)
1 z4 s- ^2 c) x& s {
5 `1 D- \1 M4 [* e ECHO("CaUGht exception: %s\n", ex.Message());7 `' ?! Q# q- c' D9 x; h6 J6 p
}
* g/ M7 P' I, `5 h2 ` return 0;2 |7 f: p9 G0 z2 D8 j- ?* H$ M" b
}
7 X* ]- K1 e( }//------------------------------------------------------------------------------
( w! m0 j- a5 ], S f// Callback Name: myEditCB
$ H* k4 F! l) s6 H6 g' r3 Z) }* H& N// This is a callback method associated with editing a UDO., Z7 ~- E" Z" i3 \0 C3 U0 K. e
//------------------------------------------------------------------------------) G- f6 Z* {9 m$ s6 j
extern int myEditCB(UserDefinedEvent* editEvent)7 p8 W& R1 _ P
{" U$ d; `; \/ X8 s
try
# O( l" C$ h& R" w/ T# y" | {
; a8 R$ X4 I5 D: h e2 s // required for calls to legacy UF routines! Y' A7 s) h5 K8 n/ P% e1 O
// such as UF_DISP_add_item_to_display R+ K( n+ a4 d* v9 ~
UF_initialize();! T1 E0 f: ]5 k# i$ n) `
5 }6 `2 c. { N+ X- s3 g6 A; L: J
View* myView = NULL;
8 c0 [4 G( c. F Point3d myCursor(0,0,0);
% y. Y* W2 }. q/ N3 h1 o1 Y) P$ G/ M- r. V( @0 |
// highlight the current udo we are about to edit
& _; Z* ~4 l5 G( e1 b7 h2 \7 a J2 B, a // this is helpful if multiple udo's were on the selection
( @5 n% O! G* |8 Z9 u/ M. m7 ~ // list when the user decided to edit them
0 G. k4 e' W" R8 L% \! @5 |- [& d editEvent->UserDefinedObject()->Highlight();+ b$ _5 @* a7 z* K, a
1 N* K2 J4 \# G/ l* `: {2 L- Q
// ask the user to select a new origin for this UDO" T2 z) W& x+ M* v
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);( ~, d2 J# R8 c2 J( Y
// we are done asking the user for input... unhighlight the udo
2 H. j/ t" ]9 r/ S9 _ editEvent->UserDefinedObject()->Unhighlight();
3 b7 ?) f% H2 G3 Q r, j7 l: t( N; `7 F2 v% B* |
// use the new screen position (if the user picked one)
2 r) F8 k/ f; d+ t/ C% P if( myResponse == Selection::DialogResponsePick )# D3 Y; G+ H; ^7 k* y& f
{
3 H0 f7 g) z/ z std::vector<double> myUDOdoubles(3);
$ `) T0 I/ ~6 G) l5 n myUDOdoubles[0] = myCursor.X;
7 k) e& q, N8 q% _ myUDOdoubles[1] = myCursor.Y;
1 G" L- M5 X6 M( h myUDOdoubles[2] = myCursor.Z;+ s0 |# ?8 `2 T3 ?
// store the newly selected origin with the udo$ W- F: G/ _) g3 \" X" l5 a2 E* g6 Z
editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);) O+ l3 ], X2 y7 T+ m
// add the udo to the display list manually% s k1 {* k* d: k: r% Z
// this will force the udo display to regenerate
+ D$ r1 Y" h/ L" [! \5 U // immediately and show the changes we just made5 j6 M% o& _( C1 i9 r2 Z) e1 N) F
UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());$ X* X8 z; d! i4 z+ v
}' c/ X; ]- p( d1 E0 e0 \% M9 g6 r
UF_terminate();
2 w0 L! G$ i* t4 b } catch (NXException ex)
6 b" h( l2 z3 g0 [* S$ }3 D {! O+ T8 l T- c" z
ECHO("Caught exception: %s\n", ex.Message());
& v n G1 D! z } return 0;
0 R y/ `9 Y+ L, D8 r6 }}3 X$ [* w0 A9 ?5 k# D, L
//------------------------------------------------------------------------------
. r& U9 ?, G' S// Callback Name: myInfoCB& b( M3 q* i8 v- P4 x3 C; n4 s
// This is a callback method associated with querying information for a UDO.
, t) ^+ ]7 c( m+ w// The information is printed in the listing window.- ~6 g! m1 H# D9 q7 m
//------------------------------------------------------------------------------5 J# Z0 c/ | P- M( B3 _1 W
extern int myInfoCB(UserDefinedEvent* infoEvent)6 x( k: D! v) U% O! t$ q
{
5 ]$ _9 J* C' d, D2 u; E) r try
8 w$ _6 P2 T: X3 P' a; w0 L, Q {
6 L/ J, ~2 e _# P7 ?9 B ListingWindow* theLW = theSession->ListingWindow();
! b1 y$ J$ k* e" e% [ char msg[256];3 }& _9 C% u& v6 F. G
theLW->Open();6 r( `' K" O9 a* y+ Y
theLW->WriteLine(" ");8 a' f: [; |1 O8 H8 E) G
theLW->WriteLine("------------------------------------------------------------");
9 Y, d$ a: _. Q5 d theLW->WriteLine("Begin Custom Information");
8 k: R" q8 V1 w; O4 ~1 S theLW->WriteLine(" ");8 k6 J. R" a! \4 D
sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
4 G4 ^0 G/ p! W theLW->WriteLine(msg);
- |% v) P! Y8 b; L% @" g+ m9 T sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
: k! q" u" y* G. _" i+ m" m theLW->WriteLine(msg);
! `( t6 }9 J/ c. ? d std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
/ T, H7 b# }3 Q$ D# R- l sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
: e$ q+ v! g% N5 s% G" D. ~ theLW->WriteLine(msg);! Z5 Y* f" d8 U: F6 Z" [! Q3 p( l
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );
, |8 H3 ?7 q" h/ i2 V+ y8 E theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );! U. _+ c0 x" v6 j9 Y' l
theLW->WriteLine(msg);% q: |# r! h' V+ x8 `
theLW->WriteLine(" ");
8 B; Z& E3 i% F9 [* l, C" ] theLW->WriteLine("End Custom Information");
6 e( Y, M4 {! ]0 Z }
x! j+ O! c" H" a" G- P catch (NXException ex)
7 ^6 p0 w$ i5 M& J+ O3 g0 q0 {$ t {
" a+ T' f% k4 C/ j! _$ b: I ECHO("Caught exception: %s\n", ex.Message());' Z; ~4 _3 o' {. F: k
}' R( s: l! l. O$ Q
return 0;4 z2 |& N @8 @" k) c6 G
}
6 f; [# |: h' J k0 V" @
1 G) Z. f/ l0 |* I5 q& z//------------------------------------------------------------------------------
, S- a2 A4 d; H1 A- Q/ Q// initUDO
+ o( J; n# S& `; n! S3 f$ m// Checks to see which (if any) of the application's static variables are3 Y a3 i$ J% K# O
// uninitialized, and sets them accordingly.9 Q B& ^+ H o0 v: T
// Initializes the UDO class and registers all of its callback methods.0 M, [4 h6 Y( [) o+ E
//------------------------------------------------------------------------------
2 H- x7 d X" A3 M9 Tstatic int initUDO( bool alertUser)
1 Y* R, b |/ e. F! r{
: l3 b! }, s- e3 \( c7 E- D y try
$ M* G& k1 r9 ?0 D% C% I; C; @ {
0 J+ b9 g' V5 {8 Q" \' Y if (theSession == NULL)
" l0 V2 n( i) ]2 k* }9 x {
3 H- S/ I( ^, `2 T, X2 g# c theSession = Session::GetSession();
( V3 t% d8 ~) \0 y }
, n$ Q7 _$ H! h7 P; B# n$ ? if( theUI == NULL )
" ~6 U. \7 X- m& \* A2 T# d1 Y {4 v" T- H2 D3 g* U9 g9 k
theUI = UI::GetUI();8 `# A; r; n* O) z% F. m0 U
}5 U/ t2 ~9 R$ [! v! U/ D5 @
if (myUDOclass == NULL)6 k+ V+ x R( H
{3 D* {7 n4 L0 e# |! r
if (alertUser)
3 p- H! v: ^4 R8 s {
, ?9 A1 ]8 z5 W9 [9 d9 x ListingWindow*, A0 B& K* P" [1 H; f6 L
theLW = theSession->ListingWindow();
# _ O) q. v4 b theLW->Open();
+ A; M* \5 X% D% ~ theLW->WriteLine("Registering C++ UDO Class");
) P4 `% r7 s- |3 d* ^ }( P* ~$ N! p& I7 Y$ Q& o
// Define your custom UDO class
; m1 k: z, B1 W/ S. F' }" r* R myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");
! g! G! o, Z+ }0 v; X // Setup properties on the custom UDO class
) O8 s X: D% \2 O2 C. Y myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);
, r7 K" {4 f, W: w8 }; [8 ? // Register callbacks for the UDO class* w5 O0 _* `" j4 A$ C% S, p$ a* Q
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));5 [& q& A4 w$ Q; j( Z% S, ^
myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));8 _5 S' u+ C4 u c* F" t$ f
myUDOclass->AddFitHandler(make_callback(&myDisplayCB));
) G' S k S4 N9 _ myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));
/ e* J: `) ^. b0 d# C9 N myUDOclass->AddEditHandler(make_callback(&myEditCB));
, ]! x0 [: k( M7 p2 k5 u6 T5 R myUDOclass->AddInformationHandler(make_callback(&myInfoCB));0 N# j0 y- g2 v5 H2 v
// Add this class to the list of object types available for selection in NX.: E' A, x; W6 ~ ^
// If you skip this step you won't be able to select UDO's of this class,
2 {$ v5 Y; |' s! P3 J. s // even though you registered a selection callback.' m) F4 a( R9 B$ Q: W' d3 V. s
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
# Y7 ?* ? \9 Z+ h/ g }- q2 H" j! A2 b
}
" o: z0 y( y2 R( i. S catch (NXException ex) w3 c* y M8 j/ ?
{
$ y. [( j4 K. G3 I. w" } ECHO("Caught exception: %s\n", ex.Message());
, ~) i5 M! `, l9 g1 u3 P2 F }
5 m2 I- H# F' K# t3 k return 0;+ y% H/ K* g. B$ }3 n: W- {
}
$ d! F: W: \2 r& l/ W- h/ y, O" Q. i6 q; Z& G, ~1 @
//------------------------------------------------------------------------------* H' c6 k% o% ^. z& Z
// ufusr (Explicit Activation). Q: b/ Q- E* M
// This entry point is used to activate the application explicitly, as in( T0 ?5 F5 p+ Y
// "File->Execute UG/Open->NX Open..."
7 |) A3 @* I! V& V//------------------------------------------------------------------------------ _& e; O+ Z, U5 H! d# K% d
extern void ufusr( char *parm, int *returnCode, int rlen )" f4 V! G2 ]+ l8 \+ c
{
2 @& Q& D$ {, a! f3 J: l1 d try8 |1 [4 L' b) }4 l$ J; [& j! {( P
{
+ @& L6 r5 g1 r9 e0 P& b // required for calls to legacy UF routines0 _% r' o, @9 F& E* ?
// such as UF_DISP_add_item_to_display
4 f& B o! R7 ]9 K- I; u UF_initialize();& F* R$ r+ ?! Y2 O+ p5 N4 a3 o
6 \! Y* p. m" V; A // initialize the UDO - if we didn't load this library at
! ]1 H: X1 ~& ? // startup, here is our second chance to load it4 N) V; ]7 Q5 ?- s
initUDO(true);" @) y/ v9 R& N/ O( P
" ?% ` a% p5 @
// if we don't have any parts open create one
4 j$ `# Q! Z' ^9 j2 S4 M6 B BasePart* myBasePart = theSession->Parts()->BaseDisplay();' b4 }8 u' J, n% X3 y V0 E4 L! P
if( myBasePart == NULL)
1 l( o0 V* R& Y, Q {* n7 H! g' y& a. Z9 [! J
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
' V% [$ \& ?* G }7 t* p5 M4 p2 B
2 J( i: D8 x. e% T. N3 Q$ P/ G View* myView = NULL;- K6 \; l* y- S- K' R* A
Point3d myCursor(0,0,0);( G4 w% V% x* p8 p e5 Y
7 T1 D& E0 k+ j5 P3 B( G // ask the user to select an origin for this UDO
0 a; l# o3 X* X Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
/ }8 V [2 k& T1 ? if( myResponse == Selection::DialogResponsePick )
2 U) m, |7 R% ]' H {5 I: A. g$ G% G% v$ C; c
// The user selected a point - go ahead and create the udo; W, q) u7 I* a8 b! A. e+ ?
UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();8 X. W7 M; ]6 ^9 i: X) O
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);
8 N: l' s" o& m5 R8 h // set the color property of the udo - just for fun :)
; I5 h& o+ j) m* F/ M firstUDO->SetColor(36);7 p' q' l; n# ^+ n) E
// store the origin selected by the user with the udo
9 j! p; ~ `+ B+ e8 j- L std::vector<double> myUDOdoubles(3);
" B& E3 l& I6 |3 J$ W% B6 F myUDOdoubles[0] = myCursor.X;
9 l) k9 i3 f: b1 ~ myUDOdoubles[1] = myCursor.Y;
* @" o# ^. g) D+ r3 q" O9 \ myUDOdoubles[2] = myCursor.Z;
" C) U) [- W) @+ f4 u firstUDO->SetDoubles(myUDOdoubles);& e: Y7 H0 H I: g+ a
// add the udo to the display list manually
. J* R. w* T8 p a5 B. p3 ]7 y // this will force the udo to display immediately# q' R& o# m4 `+ L
UF_DISP_add_item_to_display(firstUDO->GetTag());
1 M1 r0 G3 j! W- c( y* H+ \ }* f5 @2 h1 k; _" c2 [" x/ a
UF_terminate();3 O! ^' L3 X0 Z$ S
}
/ K* `) Y. V& |2 N7 \, v catch (const NXOpen::NXException& ex)+ X, ~- c b& b6 H8 E; ?
{
; ]/ i2 ^& |9 \0 x% y2 p5 L ECHO("Caught exception: %s\n", ex.Message());
) E& k! G& L. b- F; o }
! V7 @$ w) L- z. B; c}
( x$ ?' d* U1 P+ K9 X: g% L, ^/ A: @% J4 s
//------------------------------------------------------------------------------8 Q. n6 \& U/ J* d5 v
// ufsta% L; Y9 c) C/ S. j* K0 n0 T
// Entrypoint used when program is loaded automatically" V; y2 N+ H+ f2 h8 J, N5 ]6 `
// as NX starts up. Note this application must be placed in a
3 N7 N$ k) o; [8 c7 [( H* F# r1 t9 ^// special folder for NX to find and load it during startup.
1 o( u& s5 e! v! V; C5 O+ [+ z// Refer to the NX Open documentation for more details on how
4 x/ Y0 g" N" a6 v2 a$ Q( l) u$ K// NX finds and loads applications during startup.
4 k( B |2 S2 n& G//------------------------------------------------------------------------------
' p- \" S$ x0 [/ y5 P2 sextern void ufsta( char *param, int *returnCode, int rlen ): b, W3 z, F0 x5 M
{
. o4 W$ L. K1 s1 Q2 t- L try1 e& X. w7 g! E' p2 Y9 ]
{" Q# Q2 z" `1 _5 r& y! D, C$ D
initUDO(false);- h: {0 _5 C* Z3 F& x6 P$ Z3 L
}" m6 E6 r, P' V! G# V1 x
catch (const NXOpen::NXException& ex)
5 |; M; ^- J& E: P4 u w+ a {" l# u/ e; s0 d+ T/ ?7 n
ECHO("Caught exception: %s\n", ex.Message());
0 C" Y5 k3 d5 F: l% s }% s- u4 Y0 W D) q& c- [9 |
}! U( e6 ^0 M! L# z4 U" X; Z( U
" z& d& q* X0 S8 R5 C: A" j" Q//------------------------------------------------------------------------------' y' ^2 }$ A' c+ z. z5 M8 o
// ufusr_ask_unload
- l" O) L8 y3 [ y* p/ S$ v// Make sure you specify AtTermination for the unload option.- K! n0 B& r0 O w( |9 v9 Q
// If you unload the library before the NX Session Terminates. o7 v6 p. ~, Y( d: y; |0 G
// bad things could happen when we try to execute a udo
' i1 W% e! x3 o4 x// callback that no longer exists in the session.
/ s) K0 ^, X' C# M1 l9 x1 p//------------------------------------------------------------------------------! H% x( p, \6 l1 C
extern int ufusr_ask_unload( void )
/ H4 p5 q# |6 I2 N+ J/ G# S/ `{9 F0 U% N9 z* P. l( Y$ z# |$ k
return (int)Session::LibraryUnloadOptionAtTermination;0 m; ^" p% P: E. P1 X
}
7 f5 G S" B1 v6 R
( }) x7 O1 x- ^ |
|